Python正则表达式:选择一个正则表达式或另一个

时间:2014-07-18 15:46:09

标签: python regex

我正在尝试创建一个选择使用一个正则表达式或另一个正则表达式的正则表达式 - 取决于输入。这是我的正则表达式的简化版本:

string = '78 east easy street New York NY 11011'
REGEX = r'(?:' +\
            r'(?P<num1>6\d+)' +\
            r'|' +\
            '(?P<num2>7\d+)' +\
        r')'
m = re.match(REGEX, string)

我的结果如下:

 78 east easy street New York NY 11011
    Matched: 78
    num1:   None
    num2:   78

我的问题是: 1.为什么num1和num2都出现在结果中?它会选择正则表达式1还是2? 2.有没有办法让像下面这样的正则表达式工作(在创建复杂模式匹配时会有所帮助:

REGEX = '(?:' + '(?P<num>6\d+)' +  '|' + '(?P<num1>7\d+)' + ')'

编辑:我在第一个片段的预期输出是为字符串选择正确的正则表达式,因此输出上的num1或num2。

2 个答案:

答案 0 :(得分:3)

  

1)为什么num1和num2都出现在结果中?它会选择正则表达式1还是2?

您有两个捕获组,因此您将同时出现num1num2。它没有选择&#39;一,它只是通过匹配的第一部分。您将获得两个捕获组,无论是否所有部分都捕获了某些部分,因为它们都在整体表达式中。

  

2)有没有办法让像下面这样的正则表达式工作(在创建复杂的模式匹配时会有所帮助:

    REGEX = '(?:' + '(?P<num>6\d+)' +  '|' + '(?P<num1>7\d+)' + ')'

如果您尝试上述功能,只需现在就可以获得numnum1。如果你打算让两个组都命名相同,那么不,至少不是在python中。

例如,您可以在C#中使用它,因为正则表达式实现允许具有相同名称的捕获组。

在PCRE和实现这个正则表达式引擎的语言中(包括python中的regex模块,但遗憾的是在当前的re模块中不可用),你有&#34;重复的子模式组&# 34;语法:

(?| ... | ... )

如果每个&#39;中有一个捕获组,则它们将进入一个组,无论哪两个匹配。

E.g。

(?|(?P<num>6\d+)|(?P<num>7\d+))

将使用匹配的部分返回名为num的组。

答案 1 :(得分:2)

要添加到@Jerry的答案,您可以使用Python的regex模块执行此操作。

>>> import regex
>>> s = '78 east easy street New York NY 11011'
>>> m = regex.match(r'(?|(?P<num>6\d+)|(?P<num>7\d+))', s)
>>> m.group('num')
'78'

被视为重复子模式组的条件正则表达式在此类组中( .. )的任何子模式中共享相同的数字。如果满足条件,则使用第一种模式;否则使用第二种模式。

如文件中所述:

  

具有相同组名的组将具有相同的组编号,具有不同组名的组将具有不同的组编号。组号将在分支重置的不同分支中重用...例如。 (?|(first)|(second))只有 1 组。