首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >忽略外部分组并仅返回交替匹配的组

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

Stack Overflow用户
提问于 2018-02-04 06:10:23
回答 1查看 292关注 0票数 1

我有以下正则表达式:

代码语言:javascript
复制
regex = re.compile(r'(\((\d{3})\)\s*|(\d{3})-?)')

本质上,它在alternation中包含一个alternation和一个grouping。我只想考虑alternation中的分组:第一个和第二个(\d{3}),并且只返回一个匹配的组。

考虑到以下情况,以下是我的预期:

代码语言:javascript
复制
regex.match('(123) ').groups()

期望值:

代码语言:javascript
复制
('123',)

实际:

代码语言:javascript
复制
('(123) ', '123', None)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-04 06:29:35

你正期待着这个

代码语言:javascript
复制
(\((\d{3})\)\s*|(\d{3})-?)

返回123,但您有两对分组括号--一对从开头开始,另一对在\d之前开始,因此您将返回两个组。如果你不想要(123),但是你想要123,那么外层对就不能被捕获:

代码语言:javascript
复制
(?:\((\d{3})\)\s*|(\d{3})-?)

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

代码语言:javascript
复制
>>> regex = re.compile(r"(?:\((\d{3})\)\s*|(\d{3})-?)")
>>> regex.match('(123) ').groups()
('123', None)
>>> tuple(filter(None, regex.match('(123) ').groups()))
('123',)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48602589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档