我有以下正则表达式:
regex = re.compile(r'(\((\d{3})\)\s*|(\d{3})-?)')本质上,它在alternation中包含一个alternation和一个grouping。我只想考虑alternation中的分组:第一个和第二个(\d{3}),并且只返回一个匹配的组。
考虑到以下情况,以下是我的预期:
regex.match('(123) ').groups()期望值:
('123',)实际:
('(123) ', '123', None)发布于 2018-02-04 06:29:35
你正期待着这个
(\((\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',)https://stackoverflow.com/questions/48602589
复制相似问题