在Python正则表达式中捕获重复的子模式

时间:2012-03-19 04:09:09

标签: python regex

在匹配电子邮件地址时,在匹配yasar@webmail之类的内容之后,我想捕获(\.\w+)中的一个或多个(我正在做的事情有点复杂,这只是一个例子) ),我尝试添加(。\ w +)+,但它只捕获最后一个匹配。例如,yasar@webmail.something.edu.tr匹配但仅在.tr部分后包含yasar@webmail,因此我丢失了.something.edu个组。我可以在Python正则表达式中执行此操作,还是先建议匹配所有内容,然后再拆分子模式?

3 个答案:

答案 0 :(得分:12)

这将有效:

>>> 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']

请注意,只要电子邮件地址很简单,regex就可以了 - 但是有很多东西会破坏它们。有关电子邮件地址正则表达式的详细处理,请参阅this question

答案 1 :(得分:6)

您可以通过执行此操作来解决(\.\w+)+仅捕获最后一场比赛的问题:((?:\.\w+)+)

答案 2 :(得分:3)

这就是你要找的东西:

>>> import re

>>> s="yasar@webmail.something.edu.tr"
>>> r=re.compile("\.\w+")
>>> m=r.findall(s)

>>> m
['.something', '.edu', '.tr']
相关问题