如何用Python正则表达式从多行字符串中捕获纯5位数字序列
问题:精准捕获命令输出中的纯5位数字序列
需要从两种命令输出中仅捕获纯5位数字组成的序列,排除长度不符的数字(比如4200000089)。原代码用re.search('(\d{5} )+',cmd_result,re.M)无法完整捕获目标内容,现提供正确实现方案。
命令输出示例
命令输出1:
Refresh Epoch 14
65041 65000 65062 65496 65489 65496 65489 4200000089
192.168.1.2 (via vrf office) from 10.254.233.3 (10.133.1.3)
命令输出2:
Refresh Epoch 14
65041 65000 65062 65496 65489 65480
192.168.1.2 (via vrf office) from 10.254.233.3 (10.133.1.3)
目标捕获内容
- 命令输出1对应:
65041 65000 65062 65496 65489 65496 65489 - 命令输出2对应:
65041 65000 65062 65496 65489 65480
现有代码问题
原代码仅能捕获部分5位数字序列,无法覆盖所有符合要求的内容:
import re cmd_result = '''Refresh Epoch 14 65041 65000 65062 65496 65489 65480 192.168.1.2 (via vrf office) from 10.254.233.3 (10.133.1.3)''' as_value = re.search('(\d{5} )+',cmd_result,re.M) print(as_value) # 输出:<re.Match object; span=(188, 224), match='65041 65000 65062 65496 65489 '>
解决方案
方法1:匹配所有独立5位数字后拼接
利用re.findall匹配所有符合条件的纯5位数字,再用空格拼接成目标字符串:
import re cmd_result1 = '''Refresh Epoch 14 65041 65000 65062 65496 65489 65496 65489 4200000089 192.168.1.2 (via vrf office) from 10.254.233.3 (10.133.1.3)''' cmd_result2 = '''Refresh Epoch 14 65041 65000 65062 65496 65489 65480 192.168.1.2 (via vrf office) from 10.254.233.3 (10.133.1.3)''' # 匹配独立的5位数字(前后为非数字或字符串边界) pattern = r'\b\d{5}\b' matches1 = re.findall(pattern, cmd_result1) matches2 = re.findall(pattern, cmd_result2) result1 = ' '.join(matches1) result2 = ' '.join(matches2) print(result1) # 输出:65041 65000 65062 65496 65489 65496 65489 print(result2) # 输出:65041 65000 65062 65496 65489 65480
说明:\b是单词边界,确保匹配的是长度恰好为5的数字,不会匹配长数字中的子串(比如4200000089中的任意5位)。
方法2:定位数字行后过滤
先提取包含目标数字的行,再从中筛选5位数字,适合输出格式固定的场景:
import re def extract_5digit_sequence(cmd_output): # 遍历所有行,定位由空格分隔数字的行(排除IP和Refresh行) for line in cmd_output.splitlines(): line = line.strip() if line and all(c.isdigit() or c.isspace() for c in line) and '.' not in line: # 拆分数字并筛选长度为5的项 digits = [num for num in line.split() if len(num) == 5] return ' '.join(digits) return '' result1 = extract_5digit_sequence(cmd_result1) result2 = extract_5digit_sequence(cmd_result2) print(result1) print(result2)
内容的提问来源于stack exchange,提问作者santosh nog
相关产品推荐
相关产品推荐

