我有这样的正则表达式匹配的这两种可能性之一:正则表达式或语句不匹配
(\b(Q|L[A-Z])\d{8}\b)
# Possibilities
LK10652174
Q10652174
现在这样做的结果是:
>>> regex.findall(string)
[(u'LK10652175', u'LK')]
我不希望它选择额外LK
匹配,是否有方法来包装OR
声明而不会得到这个额外的选择?
我有这样的正则表达式匹配的这两种可能性之一:正则表达式或语句不匹配
(\b(Q|L[A-Z])\d{8}\b)
# Possibilities
LK10652174
Q10652174
现在这样做的结果是:
>>> regex.findall(string)
[(u'LK10652175', u'LK')]
我不希望它选择额外LK
匹配,是否有方法来包装OR
声明而不会得到这个额外的选择?
是,使用非捕获括号(拖放最外面的括号,你不需要他们):
\b(?:Q|L[A-Z])\d{8}\b
感谢您的快速反应,以及不错的提示:) – Hassek 2012-08-14 21:41:47
从python文档:
当一个图案完全相匹配,该分支被接受。这个 意味着一旦A匹配,B将不会被进一步测试,即使它会产生更长的整体匹配。换句话说,'|'运营商 从不贪心。
这意味着你需要把它写这样以确保比赛是你打算整串:
import re
a = re.compile("(Q\\d{8}|L[A-Z]\\d{8})")
print a.findall("LK10652174 Q10652174")
['LK10652174', 'Q10652174']
这里是个不错的好地方测试:HTTP://www.pythonregex。 com/ – Hassek 2012-08-14 21:35:50