Python与正则表达式

2024-10-01 11:36:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试匹配以下字符串:

 2 match virtual-address 172.29.210.119 tcp eq www
  4 match virtual-address 172.29.210.147 tcp any

预期产出:

^{pr2}$

我正在使用模式:

   match virtual-address (\d+\.\d+\.\d+\.\d+)\s?(\w+)? (?>eq)?\s?(\d+|\w+)

我在:https://regex101.com/

但是当我在python中使用相同的模式进行匹配时,我得到了以下错误:

 Traceback (most recent call last):
      File ".\ace2f5_parser.py", line 119, in <module>
        virtual_ip_proto_port = re.findall(pattern_virtual_ip_proto_port, line)
      File "C:\Users\hpokhare\AppData\Local\Programs\Python\Python35-32\lib\re.py", line 213, in findall
        return _compile(pattern, flags).findall(string)
      File "C:\Users\hpokhare\AppData\Local\Programs\Python\Python35-32\lib\re.py", line 293, in _compile
        p = sre_compile.compile(pattern, flags)
      File "C:\Users\hpokhare\AppData\Local\Programs\Python\Python35-32\lib\sre_compile.py", line 536, in compi
        p = sre_parse.parse(p, flags)
      File "C:\Users\hpokhare\AppData\Local\Programs\Python\Python35-32\lib\sre_parse.py", line 829, in parse
        p = _parse_sub(source, pattern, 0)
      File "C:\Users\hpokhare\AppData\Local\Programs\Python\Python35-32\lib\sre_parse.py", line 437, in _parse_
        itemsappend(_parse(source, state))
      File "C:\Users\hpokhare\AppData\Local\Programs\Python\Python35-32\lib\sre_parse.py", line 767, in _parse
        len(char) + 1)
    sre_constants.error: unknown extension ?> at position 53

这个错误是什么意思。它不支持吗?>;。关于如何解决这个问题的任何想法。在


Tags: inpyparseliblocallinevirtualusers
2条回答

可以在Python中使用此regex:

\bmatch virtual-address (\d+\.\d+\.\d+\.\d+)\s?(\w+) (?:eq\s+)?(\w+)

RegEx Demo

pythonregex不像PCRE那样支持原子组语法(?>..)。在

如果为“python”修改regex101的风格,您将看到您不能使用(?>eq)?

另一种方法是使用$,在行尾断言位置。使用(\w+)$将捕获字符串语句的最后一个。在

import re

text = [
    '2 match virtual-address 172.29.210.119 tcp eq www',
    '4 match virtual-address 172.29.210.147 tcp any'
]

regexp = re.compile(r'match virtual-address (\d+\.\d+\.\d+\.\d+)\s(\w+).*?\s(\w+)$')
for i in text:
    ip, protocol, url = regexp.search(i).groups()
    print(ip, protocol, url, '', sep='\n')

相关问题 更多 >