开发过程中碰到一个不小的坑,就是Python正则表达式匹配结果怎么也不正确,结果发现匹配本身问题不大,但输出居然是tuple导致程序异常
需求是在字符串中匹配不带文件路径的文件名,例如 请打开/home/pyTest_2024-02-28_16:11:22_88.py文件,需要匹配出pyTest_2024-02-28_16:11:22_88.py。
1 通过代码搜索的结果,提示在字符串中匹配文件可以这么干:
pattern1 = r"([^/\\]+)\.[^/\\]+$"
file_1 = re.findall(pattern1, message, re.DOTALL)[0]
print("文件路径是 %s" % str(file_1))
结果是
<class ‘str’>
文件路径是 pyTest_2024-02-28_16:11:22_88.py文件
很明显,没有限制文件后缀范围,那么把我需要的后缀(py|html|js)加到正则表达式
2 下一步
pattern2 = r"([^/\\]+)\.(py|html|js)"
file_1 = re.findall(pattern2, message, re.DOTALL)[0]
print("文件路径是 %s" % str(file_1))
但匹配的结果是tuple类型
<class ‘tuple’>
文件路径是 (‘pyTest_2024-02-28_16:11:22_88’, ‘py’)
导致了程序的异常
经翻阅资料python 正则表达式findall匹配问题
发现问题
pattern2 有两个括号,于是python就把两个匹配项匹配结果组成了tuple
知道了原因修改就很简单
pattern3 = r"[^/\\]+\.py|html|js"
file_1 = re.findall(pattern3, message, re.DOTALL)[0]
print("文件路径是 %s" % str(file_1))
<class ‘str’>
文件路径是 pyTest_2024-02-28_16:11:22_88.py
得到了需要的结果