如何在文本文件中匹配包含205与212的两类目标行?正则表达式仅匹配单一模式的问题解决
解决正则匹配同时包含205/212前缀行的问题
你的问题出在正则表达式的分组写法上——原来的([205][212])并不是匹配"205"或"212"这两个完整前缀,而是在匹配单个字符的组合,自然没法同时命中两类目标行。下面给你具体的修复方案:
修正后的正则表达式
把原来的分组部分从字符组组合改成分支匹配,就可以同时匹配以205或212开头的数字序列了:
pattern = re.compile(r"^\S+ \S+ \S+ (205|212)\d+.*$")
为什么原来的正则不行?
你写的[205][212]是两个字符组的拼接:
[205]表示匹配单个字符:2、0、5中的任意一个[212]等价于[21](字符组里重复的字符会被自动忽略),表示匹配单个字符:2或1
所以这个组合只会匹配像22、21、02这类两位字符,完全不是你要的"205"或"212"三个连续字符的前缀。
完整代码示例
下面是可以直接运行的Python代码,用来提取所有符合要求的行:
import re # 修正后的正则 pattern = re.compile(r"^\S+ \S+ \S+ (205|212)\d+.*$") # 你的文本内容 input_text = """mpls switch-l2vc 10.123.143.209 205316002 tunnel-policy TE between 10.123.130.1 205316004 tunnel-policy TE backup 10.123.130.2 205316004 tunnel-policy TE encapsulation vlan mpls switch-l2vc 10.124.17.165 205315402 tunnel-policy TE between 10.123.130.1 205315404 tunnel-policy TE backup 10.123.130.2 205315404 tunnel-policy TE encapsulation vlan mpls switch-l2vc 10.124.18.113 212359002 tunnel-policy TE between 10.123.130.1 205359004 tunnel-policy TE backup 10.123.130.2 205359004 tunnel-policy TE encapsulation vlan mpls switch-l2vc 10.124.17.161 212315002 tunnel-policy TE between 10.123.130.1 205315004 tunnel-policy TE backup 10.123.130.2 205315004 tunnel-policy TE encapsulation vlan mpls switch-l2vc 10.124.17.168 205315702 tunnel-policy TE between 10.123.130.1 205315704 tunnel-policy TE backup 10.123.130.2 205315704 tunnel-policy TE encapsulation vlan""" # 按行遍历并匹配 target_lines = [line for line in input_text.split('\n') if pattern.match(line)] # 输出结果 print("提取到的目标行:") for line in target_lines: print(line)
拓展:匹配任意位置的205/212前缀
如果你的需求不是限定第四项是目标数字,而是只要行内任意位置出现以205或212开头的数字就提取,可以把正则简化成:
pattern = re.compile(r".*(205|212)\d+.*")
内容的提问来源于stack exchange,提问作者saratoon J.




