我有这个正则表达式来匹配这两种可能性之一:
(\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
与往常一样,(?:...)
将匹配但不捕获。
(\b(?:Q|L[A-Z])\d{8}\b)
来自 python 文档:
当一个模式完全匹配时,该分支被接受。这意味着一旦 A 匹配,B 将不会被进一步测试,即使它会产生更长的整体匹配。换句话说,'|' 运营商从不贪婪。
这意味着您需要像这样编写它以确保匹配是您想要的整个字符串:
import re
a = re.compile("(Q\\d{8}|L[A-Z]\\d{8})")
print a.findall("LK10652174 Q10652174")
['LK10652174', 'Q10652174']