正则表达式中的分组和OR

时间:2015-02-17 01:03:08

标签: python regex

>>> 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会起作用。但它不是,如果你是我,你会怎么做?

3 个答案:

答案 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']