Python3.7中使用re.escape构造正则无法匹配目标字符串问题排查
问题分析与修正方案
核心问题
- 正则里的
.*是贪婪匹配模式,会尽可能多的吞掉字符串内容,直接匹配到了日期时间和目标路径之间的最后一个空格前,导致后续的日期时间匹配规则无对应内容可匹配,最终re.fullmatch返回空。 - 次要优化点:原正则里的
[\d]可以直接简化为\d,功能一致写法更简洁。
可行修正方案
方案1:修改为非贪婪匹配
把.*替换为.*?非贪婪匹配模式,会尽可能少匹配前缀内容,保证后续的日期时间规则可以正常命中对应片段,修正后代码如下:
import re a = '/hi/ji/hello/hello.log' # 仅将.*改为.*?非贪婪匹配即可 regex = rf".*?\s+(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2})\s+{re.escape(a)}" line = r'-rw-rw---- hacluster haclient 6889422 2021-07-22 17:53 /hi/ji/hello/hello.log' y = re.fullmatch(regex, line) if y: print(y.group(1)) # 输出结果:2021-07-22 17:53
方案2:使用精准前缀匹配(更稳定)
因为待匹配行的前缀是固定的4段非空白内容:权限、用户名、用户组、文件大小,直接用规则匹配前缀,完全避免贪婪匹配的歧义,逻辑更稳定:
import re a = '/hi/ji/hello/hello.log' # (?:\S+\s+){4}表示匹配4段非空白字符加后续分隔空格,?:表示该分组不捕获 regex = rf"(?:\S+\s+){4}(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2})\s+{re.escape(a)}" line = r'-rw-rw---- hacluster haclient 6889422 2021-07-22 17:53 /hi/ji/hello/hello.log' y = re.fullmatch(regex, line) if y: print(y.group(1))
内容的提问来源于stack exchange,提问作者Rocky
相关产品推荐
相关产品推荐

