2012-08-14 66 views
2

我有这样的正则表达式匹配的这两种可能性之一:正则表达式或语句不匹配

(\b(Q|L[A-Z])\d{8}\b) 

# Possibilities 
LK10652174 
Q10652174 

现在这样做的结果是:

>>> regex.findall(string) 
[(u'LK10652175', u'LK')] 

我不希望它选择额外LK匹配,是否有方法来包装OR声明而不会得到这个额外的选择?

+0

这里是个不错的好地方测试:HTTP://www.pythonregex。 com/ – Hassek 2012-08-14 21:35:50

回答

1

是,使用非捕获括号(拖放最外面的括号,你不需要他们):

\b(?:Q|L[A-Z])\d{8}\b 
+0

感谢您的快速反应,以及不错的提示:) – Hassek 2012-08-14 21:41:47

1

像往常一样,(?:...)会一致,但无法反映的。

(\b(?:Q|L[A-Z])\d{8}\b) 
+0

感谢您的快速响应! – Hassek 2012-08-14 21:42:29

-1

从python文档:

当一个图案完全相匹配,该分支被接受。这个 意味着一旦A匹配,B将不会被进一步测试,即使它会产生更长的整体匹配。换句话说,'|'运营商 从不贪心。

这意味着你需要把它写这样以确保比赛是你打算整串:

import re 
a = re.compile("(Q\\d{8}|L[A-Z]\\d{8})") 
print a.findall("LK10652174 Q10652174") 
['LK10652174', 'Q10652174'] 
+0

这是不正确的,用任何最新投票答案进行测试,它会返回与您的结果相同的结果。文档的含义是,如果第一个选项匹配(也就是'Q \ d {8}'),它就不会在__same模式中尝试'L [A-Z]'选项,而不是在整个文本中。 – Hassek 2012-08-14 23:09:08

+0

足够公平......捕获组与非捕获组匹配属性对解释为什么原始正则表达式不具有属性(A | B)C = AC | AB至关重要。 – DrSkippy 2012-08-15 18:02:49