想要在条件内检查python正则表达式匹配(组)的结果

时间:2017-11-09 09:24:57

标签: python regex

我想检查一些正则表达式匹配是否成功。如果是,我想访问匹配中的组。如果我不需要这些小组,我可以这样做:

if re.match(pobj1,string):
    # First match worked
elif re.match(pobj2,string):
    # First match failed, but second one worked.
[...]

由于我没有将比赛结果分配给任何内容,因此我不知道如何访问属于比赛的任何组。因此,我会在条件之前将匹配分配给变量。但这意味着我每次都要运行所有比赛,而不仅仅是必要的比赛。

mobj1 = re.match(pobj1,string)
mobj2 = re.match(pobj2,string)  # Might be expensive
if mobj1:
    # First match succeeded.  Use the match information
    primary_list.append(mobj1.group(1))
elif mobj2:
    # First match failed, but second one worked.  Use info from #2.
    secondary_list.append(mobj2.group(1))
[...]

我如何只运行必要的匹配,同时仍然可以在以后访问该匹配的组?

2 个答案:

答案 0 :(得分:0)

我会列出你的对象并通过循环运行它们并在找到匹配后打破它。

for o in list_of_objects:
    matches = re.match(o,string)
    if matches:
        break

答案 1 :(得分:0)

您可以定义模式列表,并找到第一个匹配的模式next

>>> import re
>>> patterns = [re.compile('a.c'), re.compile('1.3'), re.compile('4.6')]
>>> next((p for p in patterns if p.match('abc')), None)
re.compile('a.c')
>>> next((p for p in patterns if p.match('436')), None)
re.compile('4.6')
>>> next((p for p in patterns if p.match('XYZ')), None)

None作为next的第二个参数用于避免StopIteration:

>>> next(p for p in patterns if p.match('XYZ'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration