在python中无效的regex

2024-06-30 13:34:55 发布

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

我有以下regex,它们似乎在regex101上运行良好。 如你所见,我的四种可能的组合是匹配的。在

现在,如果我想用python实现它,当我试图匹配一行类似于regex101字符串字段中的第一行(网络地址后面没有任何内容的行)时,根本找不到匹配。这是密码

import re 

l_side = 'ip prefix-list PL_FROM_7600 seq 40 permit 192.168.10.0/23'

myregex = re.compile(r'''
(ip\sprefix-list)\s
(?P<prefnam>\w+)\s
(?P<prefseq>seq\s\d+)\s
(permit|deny)\s
(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}\/[1-3]?\d)\s
((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})|
(?P<prefge>ge\s\d{1,2})|
(?P<prefle>le\s\d{1,2})|)
''', re.VERBOSE)
l_match = myregex.search(l_side)

print(l_match.group('prefnam'))
print(l_match.group('prefgele'))

这是我得到的错误

^{pr2}$

如果我从正则表达式中删除下列内容

^{3}$

那就行了。在

我在这里只想匹配gelele或{}的存在或什么都没有。我也尝试了以下几点,但没有运气。在

((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})|
(?P<prefge>ge\s\d{1,2})|
(?P<prefle>le\s\d{1,2})|(.?))

你知道这是怎么回事吗

编辑1:

在塞缪尔的回答之后,我已经测试过了,但似乎所有的案例都不匹配

  1. ip前缀列表PL_7600 seq 10 permit 192.168.1.80/28
  2. ip前缀列表PL_7600 seq 20 permit 192.168.1.80/28 ge 23 le 25
  3. ip前缀列表PL_7600 seq 30 permit 192.168.1.80/28 ge 23
  4. ip前缀列表PL_7600 seq 40 permit 192.168.1.80/28 le 23

1和2匹配,但3和4不匹配

我已将Samuel regex修改为:

(ip\sprefix-list)\s
(?P<prefnam>\w+)\s
(?P<prefseq>seq\s\d+)\s
(permit|deny)\s
(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}(?:\/[1-3])?\d)
((\s(?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2}))|
(\s(?P<prefge>ge\s\d{1,2}))|
(\s(?P<prefle>le\s\d{1,2})))?

现在看来所有的案子都是一样的。谢谢萨姆


Tags: iprele列表matchseqlistpl
1条回答
网友
1楼 · 发布于 2024-06-30 13:34:55

用这个正则表达式?在

import re 

l_side = 'ip prefix-list PL_FROM_7600 seq 40 permit 192.168.10.0/23'

myregex = re.compile(r'''
(ip\sprefix-list)\s
(?P<prefnam>\w+)\s
(?P<prefseq>seq\s\d+)\s
(permit|deny)\s
(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}(?:\/[1-3])?\d)(\s
(?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})|
(?P<prefge>ge\s\d{1,2})|
(?P<prefle>le\s\d{1,2})|)?
''', re.VERBOSE)
l_match = myregex.search(l_side)

print(l_match.group('prefnam'))
#print(l_match.group('prefgele'))

差异是为了

^{pr2}$

替换为

(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}(?:\/[1-3])?\d)

在我换下

\s
((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})|
(?P<prefge>ge\s\d{1,2})|
(?P<prefle>le\s\d{1,2})|)

通过

(\s
(?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})|
(?P<prefge>ge\s\d{1,2})|
(?P<prefle>le\s\d{1,2})|)?

相关问题 更多 >