我有以下正则表达式:
regex = re.compile(r'(\((\d{3})\)\s*|(\d{3})-?)')
基本上它包括alternation和交替内部的分组。我只想考虑交替中的分组:第一个和第二个(\d{3})
,只返回匹配的一个组。
考虑到以下情况,这就是我的期望:
regex.match('(123) ').groups()
预期:
('123',)
实际:
('(123) ', '123', None)
答案 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',)