regex Python正则表达式问题,中间有可选子字符串

nom7f22z  于 2023-06-30  发布在  Python
关注(0)|答案(1)|浏览(89)

两天来我一直用这个砸我的头。我正在尝试使用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 Attributeclient_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
"""

在这种情况下,regex应该忽略Framed-IP-Address。它确实忽略了,但它并没有捕捉到它来的时候。

lyfkaqu1

lyfkaqu11#

我建议使用

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属性,您可以访问该属性以获取整个输入字符串。

  • 详情 *
  • RADIUS-一个字
  • .*?-任意零个或多个字符,尽可能少
  • Accounting-一个字
  • [\s-]-空格或连字符
  • Request-一个字
  • (?:.*?-可选非捕获组的开始:任何零或多个字符尽可能少,那么...
  • (Framed[\s-]IP[\s-]Address.*?Attribute-第1组:Framed+空格或连字符+IP+空格/连字符+Address+任何零个或多个字符尽可能少+Attribute
  • (?:.*?Value: (?P<client_ip>\d+\.\d+\.\d+\.\d+))?-一个可选的非捕获组,匹配尽可能少的零个或多个字符+Value:+组“client_ip”:四个一个或多个数字匹配模式,用文字点分隔
  • )-组1结束
  • )?-外部非捕获组的结束
  • .*-任意零个或更多个字符
  • User-?[nN]ame - UsernameUserNameUser-name / User-Name
  • [\s-]-空格或连字符
  • Attribute-一个字
  • .*?-任何零个或多个字符尽可能少
  • Value:-文字字符串
  • \s*-零个或多个空格
  • (?P<username>\S+)-组“用户名”:一个或多个非空格字符

相关问题