Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式:选择一个或另一个正则表达式_Python_Regex - Fatal编程技术网

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

Python正则表达式:选择一个或另一个正则表达式,python,regex,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(

我试图创建一个正则表达式,它选择使用一个正则表达式或另一个正则表达式,具体取决于输入。下面是我的正则表达式的简化版本:

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

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

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

要添加到@Jerry的答案中,可以使用Python的模块来完成

导入正则表达式 >>>s='78纽约东易街NY 11011' >>>m=regex.match(r'(?|)(?P6\d+)(?P7\d+)),s) >>>m.group('num') '78' 被视为重复子模式组的条件正则表达式在该组的
(..)
中的任何子模式中共享相同的数字。如果满足条件,则使用第一个模式;否则使用第二个模式

如文件所述:

具有相同组名的组将具有相同的组号,而具有不同组名的组将具有不同的组号。组号将在分支重置的不同分支之间重复使用…例如,
(?|(第一)|(第二))
只有组
1

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

您有两个捕获组,因此将同时显示
num1
num2
。它没有“选择”一个,它只是通过匹配的第一部分。您将获得两个捕获组,无论是否捕获了所有部分,因为它们都在整体表达式中

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

    REGEX = '(?:' + '(?P<num>6\d+)' +  '|' + '(?P<num1>7\d+)' + ')'
如果每个“隔间”中有一个捕获组,则它们将进入一个组,两个匹配项中的任何一个

例如

(?|)(?P6\d+)(?P7\d+)

将返回名为
num
的组以及匹配的部分。

预期输出是什么?我在第一个代码段上的预期输出是为字符串选择正确的正则表达式,因此在输出上选择num1或num2。预期输出与实际输出有何不同?此外,第一个代码段与第二个输出相同t、 你能详细说明一下你想要两者之间的区别吗?是的,但是(对于更复杂的正则表达式)有可能像我的2ns代码片段那样将它们分开吗?谢谢,这正是我想要的!
>>> 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'
    REGEX = '(?:' + '(?P<num>6\d+)' +  '|' + '(?P<num1>7\d+)' + ')'
(?| ... | ... )
(?|(?P<num>6\d+)|(?P<num>7\d+))