两天来我一直在想这件事.我正在try 将数据包内容与regex API进行匹配:

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+).*')

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
"""
result = search(packet_re, packet1, DOTALL)

正则表达式匹配,但未能捕获Framed-IP-Address Attribute,client_ip=10.10.10.11个.这件事是Framed-IP-Address Attribute个可以或不能装在包裹里.因此,该模式包含在另一个捕获组中,以?结尾,表示出现0次或1次.

当它没有到来的时候,我应该能够忽略它.因此,数据包内容也可以是:

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
"""

在这种情况下,正则表达式应该忽略帧IP地址.它确实忽略了,但当它到来时,它不会捕捉到.

推荐答案

我建议使用

RADIUS.*?Accounting[\s-]Request(?:.*?(Framed[\s-]IP[\s-]Address.*?Attribute(?:.*?Value: (?P<client_ip>\d+\.\d+\.\d+\.\d+))?))?.*User-?[nN]ame[\s-]Attribute.*?Value:\s*(?P<username>\S+)

请看regex demo.

注意,我删除了模式两端的.*,因为您使用的是re.search,它不需要在字符串的开头进行匹配,例如re.match,而MatchData对象包含.string property,您可以访问它来获得整个输入字符串.

Details

  • RADIUS个字
  • .*?-任何零个或更多字符,尽可能少
  • Accounting个字
  • [\s-]-空格或连字符
  • Request个字
  • (?:.*? - start of an optional non-capturing group: any zero or more chars as few as possible, then...
    • (Framed[\s-]IP[\s-]Address.*?Attribute - Group 1: Framed + a whitespace or a hyphen + IP + whitespace/hyphen + Address + any zero or more chars as few as possible + Attribute
      • (?:.*?Value: (?P<client_ip>\d+\.\d+\.\d+\.\d+))?-匹配任意零个或多个尽可能少的字符的可选非捕获组+Value: +组"CLIENT_IP":四个以文字点分隔的一位或多位匹配模式
    • )-第一组结束
  • )?--外部非捕获组结束
  • .*-任意零个或多个字符,尽可能多
  • User-?[nN]ame-UsernameUserNameUser-name/User-Name
  • [\s-]-空格或连字符
  • Attribute个字
  • .*?-任何零个或多个字符尽可能少
  • Value:-文字字符串
  • \s*-零个或更多空格
  • (?P<username>\S+)-组"用户名":一个或多个非空格字符

Python相关问答推荐

aiohTTP与pytest的奇怪行为

将C struct 的指针传递给Python中的ioctel

回归回溯-2D数组中的单词搜索

"如果发生特定错误,返回值

使用Python和PRNG(不是梅森龙卷风)有效地生成伪随机浮点数在[0,1)中均匀?

inspect_asm不给出输出

剧作家Python:expect(locator).to_be_visible()vs locator.wait_for()

如何根据条件在多指标框架上进行groupby

jit JAX函数中的迭代器

连接两个具有不同标题的收件箱

如何在箱形图中添加绘制线的传奇?

海运图:调整行和列标签

通过Selenium从页面获取所有H2元素

在线条上绘制表面

无法使用requests或Selenium抓取一个href链接

在Python中,从给定范围内的数组中提取索引组列表的更有效方法

lityter不让我输入左边的方括号,'

pandas:对多级列框架的列进行排序/重新排序

Python—压缩叶 map html作为邮箱附件并通过sendgrid发送

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "