我正在使用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
。
我必须要包含哪些内容?谢谢!
答案 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