python - 忽略外部分组并仅返回交替匹配的组

标签 python regex grouping

我有以下正则表达式:

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/

相关文章:

python - 随机整数并接收并保存它们

python - Python/Pygame 中的矩形旋转

Python - 解析具有可变重复子字符串的字符串

ios - 捕获组正则表达式 NSRegularExpression iOS

excel - 在 Excel 中换行

python - Python逐行读取文件的效率

python - setuptools 为所有脚本增加了 150 毫秒的启动延迟

ruby - 不捕获 ruby 中的命名组

r - 如何根据组内的子字符串匹配两个数据框

php - MySQL 按季节分组