正则表达式与我认为的不匹配

时间:2010-07-07 16:50:10

标签: python regex

在python中,我正在编译一个正则表达式模式:

rule_remark_pattern = re.compile('access-list shc-[(in)(out)] [(remark)(extended)].*')

我希望它符合以下任何一行:

access-list shc-in remark C883101 Permit http from UPHC outside to Printers inside
access-list shc-in extended permit tcp object-group UPHC-Group-Outside object-group PRINTER-Group-Inside object-group http-https 
access-list shc-out remark C890264 - Permit (UDP 123) from UPHC-Group-Inside to metronome.usc.edu
access-list shc-out extended permit udp object-group UPHC-Group-Inside host 68.181.195.12 eq ntp 

不幸的是,它与它们中的任何一个都不匹配。但是,如果我将正则表达式写为:

rule_remark_pattern = re.compile('access-list shc-in [(remark)(extended)].*')

它匹配前2个就好了。

同样,如果我写:

rule_remark_pattern = re.compile('access-list shc-out [(remark)(extended)].*')

匹配最后2个。

有人知道这里发生了什么吗?

2 个答案:

答案 0 :(得分:3)

我的正则表达式不是基于Python的,但假设它是标准的,我认为你误解了'['和']'的使用。它们代表字符类,您似乎需要替换

尝试用“(word1 | word2)”替换“[(word1)(word2)]”构造。

编辑:刚检查了Python文档(这里:http://docs.python.org/library/re.html),我没有看到Python regexen与我习惯之间存在任何相关差异(即没有任何应该影响这个答案的准确性。)

答案 1 :(得分:2)

这主要是因为你完全误解了“定义替代方案”在正则表达式中是如何工作的:

access-list shc-(in|out) (remark|extended).*

您的尝试会创建角色类。字符类中的每个字符都独立存在,而类本身实际上只匹配允许列表中的单个字符。所以你的尝试:

[(in)(out)]

完全相同
[intou(())]

实际上与[intou()]相同,因为忽略了字符类中的重复字符。