忽略外部分组,仅返回交替匹配的组

时间:2018-02-03 22:10:23

标签: python regex grouping

我有以下正则表达式:

regex = re.compile(r'(\((\d{3})\)\s*|(\d{3})-?)')

基本上它包括alternation和交替内部的分组。我只想考虑交替中的分组:第一个和第二个(\d{3}),只返回匹配的一个组。

考虑到以下情况,这就是我的期望:

regex.match('(123) ').groups()

预期:

('123',)

实际:

('(123) ', '123', None)

1 个答案:

答案 0 :(得分:2)

你期待这个

(\((\d{3})\)\s*|(\d{3})-?)

返回123,但你有两对分组括号 - 一个从开头开始,另一个从\d开始,所以你得到两组返回。如果你不想要(123),但你确实想要123,那么外部对需要是非捕获的:

(?:\((\d{3})\)\s*|(\d{3})-?)

这只能解决问题的一部分。另一个是你的第三个捕获组,它与任何东西都不匹配,返回None。这在正则表达式本身很容易解决,因为正则表达式中的每对分组括号都会从match.groups()返回一些内容。这就是groups()的定义方式。考虑使用filter()

>>> regex = re.compile(r"(?:\((\d{3})\)\s*|(\d{3})-?)")
>>> regex.match('(123) ').groups()
('123', None)
>>> tuple(filter(None, regex.match('(123) ').groups()))
('123',)