>>> import re
>>> p='a+(\sb)|b+(\sa)'
>>> m=re.search(p, 'b a')
>>> m.group()
'b a'
>>> m.group(1)
>>>
>>> m=re.search(p, 'a b')
>>> m.group()
'a b'
我使用|
作为OR,并在|
的两边创建一个组。我想知道为什么这个小组没有被m.group(1)
捕获?感谢。
编辑我希望在文本中匹配一个正则表达式(包含一个组)。我还想在文本中匹配另一个正则表达式(与一个组)。无论哪个regrex在文本中首先匹配,我将选择该匹配的组(即如果我分别匹配每个正则表达式,我将选择匹配的正则表达式的组1)。我以为或者这两个regrex会起作用。但它不是,如果你是我,你会怎么做?
答案 0 :(得分:5)
唯一的方法是使用Python branch reset模块的regex功能。
>>> import regex
>>> m = regex.search(r'(?|a+(\sb)|b+(\sa))', 'b a')
>>> m.group()
'b a'
>>> m.group(1)
' a'
>>> m = regex.search(r'(?|a+(\sb)|b+(\sa))', 'a b')
>>> m.group()
'a b'
>>> m.group(1)
' b'
如文件中所述:
组号将在分支重置的不同分支中重复使用...例如。
(?|(first)|(second))
只有1
组。
被视为重复子模式组的条件正则表达式在此类组中( .. )
的任何子模式中共享相同的数字。如果满足条件,则使用第一种模式;否则使用第二种模式。
答案 1 :(得分:1)
因为组是在编译时使用它们在源正则表达式上出现的顺序定义的。你的正则表达式实际上有两组。
答案 2 :(得分:1)
你的正则表达式有两组。您需要打印输出第二组,因为第二组仅执行捕获。
>>> import re
>>> p='a+(\sb)|b+(\sa)'
>>> m=re.search(p, 'b a')
>>> m.group()
'b a'
>>> m.group(1)
>>> m.group(2)
' a'
>>> m=re.search(p, 'a b')
>>> m.group()
'a b'
>>> m.group(1)
' b'
>>> m.groups()
(' b', None)
使用groups()
打印所有捕获的组内容。
<强>更新强>
您可以创建一个函数来删除None
函数中存在的m.groups
部分。
>>> def extract_group(tup):
return [i for i in tup if i is not None]
>>> p='a+(\sb)|b+(\sa)'
>>> m=re.search(p, 'b a')
>>> m.group()
'b a'
>>> print(extract_group(m.groups()))
[' a']
>>> m=re.search(p, 'a b')
>>> print(extract_group(m.groups()))
[' b']