python正则表达式与预期不匹配(和pythex.org一样)

时间:2015-02-21 04:44:06

标签: python regex

我正在使用Python 3.4.2,2.7.9以及http://pythex.org的在线测试人员,并在同一输入上获得不同的结果。在下面我试图匹配由“|”分隔的单词或者字符串的结尾。

for w in ['OR', 'ELSE', 'WHAT']:
   m=re.match(r'(^|\|)(%s)($|\|)'%w,r'OR|ELSE|WHAT')
   if m:
      print(m.group())

m=re.match(r'(^|\|)(ELSE)(\||$)',r'OR|ELSE|WHAT')
   if m:
      print(m.group())

本地运行我只得到

 OR|

因此在pythex上我得到所有单词(http://bit.ly/1vmIAjX)的预期匹配。我之前不得不使用例如.*WORD.*而不仅仅是WORD

我必须要包含哪些内容?谢谢!

1 个答案:

答案 0 :(得分:0)

只需将不需要的组转为非捕获组并打印捕获组索引号,这样就不会包含前面或后面的字符。我建议您使用re.search函数而不是re.match,因为re.match必须尝试匹配字符串的开头。

>>> m=re.search(r'(?:^|\|)(ELSE)(?:\||$)',r'OR|ELSE|WHAT')
>>> if m:
    print(m.group(1))


ELSE
>>> re.search(r'(^|\|)(ELSE)(\||$)',r'OR|ELSE|WHAT').group()
'|ELSE|'

您的代码,

>>> for w in ['OR', 'ELSE', 'WHAT']:
        m=re.match(r'(^|\|)(%s)($|\|)'%w,r'OR|ELSE|WHAT')
        if m:
            print(m.group())


OR|

为什么上面的代码只显示OR|,主要是因为re.match函数。它尝试从字符串的开头进行匹配,因此它会检查^,行的开头或开头的|。根据给定列表中显示的字词,它仅与OR匹配,因为它位于开头,并且还匹配以下|符号。

>>> for w in ['OR', 'ELSE', 'WHAT']:
        m=re.search(r'(^|\|)(%s)($|\|)'%w,r'OR|ELSE|WHAT')
        if m:
            print(m.group())


OR|
|ELSE|
|WHAT