在 Python 正则表达式中捕获重复子模式
- 2024-12-20 08:37:00
- admin 原创
- 80
问题描述:
在匹配电子邮件地址时,在我匹配了类似 的内容后yasar@webmail
,我想捕获一个或多个(.w+)
(我正在做的事情有点复杂,这只是一个例子),我尝试添加 (.\w+)+ ,但它只捕获最后一个匹配项。例如,yasar@webmail.something.edu.tr
匹配但只包含.tr
后yasar@webmail
部分,所以我丢失了.something
和.edu
组。我可以在 Python 正则表达式中执行此操作吗?或者你建议先匹配所有内容,然后再拆分子模式?
解决方案 1:
re
模块不支持重复捕获(regex
支持):
>>> m = regex.match(r'([.w]+)@((w+)(.w+)+)', 'yasar@webmail.something.edu.tr')
>>> m.groups()
('yasar', 'webmail.something.edu.tr', 'webmail', '.tr')
>>> m.captures(4)
['.something', '.edu', '.tr']
对于你的情况,我会选择稍后拆分重复的子模式。这样可以得到简单易读的代码,例如,参见@Li-aung Yip 的回答中的代码。
解决方案 2:
(.w+)+
您可以通过执行以下操作来解决仅捕获最后一场比赛的问题:((?:.w+)+)
解决方案 3:
这将起作用:
>>> regexp = r"[w.]+@(w+)(.w+)?(.w+)?(.w+)?(.w+)?(.w+)?"
>>> email_address = "william.adama@galactica.caprica.fleet.mil"
>>> m = re.match(regexp, email_address)
>>> m.groups()
('galactica', '.caprica', '.fleet', '.mil', None, None)
但最多只能有六个子组。更好的方法是:
>>> m = re.match(r"[w.]+@(.+)", email_address)
>>> m.groups()
('galactica.caprica.fleet.mil',)
>>> m.group(1).split('.')
['galactica', 'caprica', 'fleet', 'mil']
请注意,只要电子邮件地址简单,正则表达式就可以了 - 但有各种各样的事情会导致这种情况发生。有关电子邮件地址正则表达式的详细说明,请参阅此问题。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD