我有以下正则表达式:
regex = re.compile(r'(\((\d{3})\)\s*|(\d{3})-?)')
本质上它包括一个 alternation以及交替内的分组。我只想考虑交替中的分组:第一个和第二个 (\d{3})
并且只应返回匹配的一个组。
鉴于以下情况,这就是我的期望:
regex.match('(123) ').groups()
预期:
('123',)
实际:
('(123) ', '123', None)
最佳答案
你正在期待这个
(\((\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',)
关于python - 忽略外部分组并仅返回交替匹配的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48602589/