捕获Python正则expression式中的重复子模式

当匹配一个电子邮件地址,当我匹配像yasar@webmail类的东西之后,我想要捕获一个或多个(\.\w+) (我正在做的更复杂一点,这只是一个例子)添加(。\ w +)+,但它只捕获最后一场比赛。 例如, yasar@webmail.something.edu.tr yasar@webmail yasar@webmail.something.edu.tr匹配yasar@webmail部分后只包含.tr ,所以我丢失了.something.edu组。 我可以在Python的正则expression式中做到这一点,或者你会build议首先匹配所有东西,然后再拆分子模式吗?

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

在你的情况下,我会去分裂重复子模式。 它导致了一个简单易读的代码,例如,见@李阿容的答案中的代码。

这将工作:

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

请注意,只要电子邮件地址很简单,正则expression式就可以了 – 但是这种情况会有所不同。 看到这个问题的电子邮件地址正则expression式的详细处理。

你可以修改(\.\w+)+只捕获最后一个匹配的问题: ((?:\.\w+)+)

这是你在找什么:

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