Python正则表达式问题:无法捕获RADIUS数据包中的可选Framed-IP-Address字段
解决RADIUS数据包正则捕获Framed-IP-Address失败的问题
原正则的核心问题是贪婪模式的.*会优先匹配最长内容,导致包含Framed-IP-Address的可选分组被覆盖,无法触发捕获。修改后的正则通过非贪婪匹配修正这个问题:
import re # 修改后的正则表达式 packet_re = r'.*RADIUS.*\s*Accounting(\s|-)Request.*?(Framed(\s|-)IP(\s|-)Address.*Attribute.*Value: (?P<client_ip>\d+\.\d+\.\d+\.\d+))?.*?(Username|User-Name)(\s|-)Attribute.*Value:\s*(?P<username>\S+).*' # 带Framed-IP的数据包测试 packet1 = """ IP (tos 0x0, ttl 64, id 35592, offset 0, flags [DF], proto UDP (17), length 213) 10.10.10.1.41860 > 10.10.10.3.1813: [udp sum ok] RADIUS, length: 185 Accounting-Request (4), id: 0x0a, Authenticator: 41b3b548c4b7f65fe810544995620308 Framed-IP-Address Attribute (8), length: 6, Value: 10.10.10.11 0x0000: 0a0a 0a0b User-Name Attribute (1), length: 14, Value: 005056969256 0x0000: 3030 3530 3536 3936 3932 3536 """ result1 = re.search(packet_re, packet1, re.DOTALL) print("packet1捕获结果:") print(f"client_ip: {result1.group('client_ip')}") # 输出10.10.10.11 print(f"username: {result1.group('username')}") # 输出005056969256 # 无Framed-IP的数据包测试 packet2 = """ IP (tos 0x0, ttl 64, id 60162, offset 0, flags [DF], proto UDP (17), length 163) 20.20.20.1.54035 > 20.20.20.2.1813: [udp sum ok] RADIUS, length: 135 Accounting-Request (4), id: 0x01, Authenticator: 219b694bcff639221fa29940e8d2a4b2 User-Name Attribute (1), length: 14, Value: 005056962f54 0x0000: 3030 3530 3536 3936 3266 3534 """ result2 = re.search(packet_re, packet2, re.DOTALL) print("\npacket2捕获结果:") print(f"client_ip: {result2.group('client_ip')}") # 输出None print(f"username: {result2.group('username')}") # 输出005056962f54
关键修改点
- 将Framed-IP分组前的
.*改为.*?(非贪婪匹配),确保正则优先尝试匹配可选的Framed-IP字段,而非直接跳过它匹配更长内容 - Username字段前的
.*也改为.*?,避免影响前面可选字段的捕获逻辑 - 保留原有的字段格式匹配逻辑(处理空格/连字符的变体),保证兼容性
内容的提问来源于stack exchange,提问作者tcpip
相关产品推荐
相关产品推荐

