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

yas*_*sar 26 python regex

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

jfs*_*jfs 30

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']
Run Code Online (Sandbox Code Playgroud)

在你的情况下,我会在以后拆分重复的子模式.它导致一个简单易读的代码,例如,请参阅@ Li-aung Yip的答案中的代码.


Li-*_*Yip 14

这将有效:

>>> 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)
Run Code Online (Sandbox Code Playgroud)

但它最多只限于六个子组.更好的方法是:

>>> m = re.match(r"[\w\.]+@(.+)", email_address)
>>> m.groups()
('galactica.caprica.fleet.mil',)
>>> m.group(1).split('.')
['galactica', 'caprica', 'fleet', 'mil']
Run Code Online (Sandbox Code Playgroud)

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


Tay*_*mon 7

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

  • 对于缩写(如果你是低级的):`re.sub(ur'((?:[az] \.){2,})',lambda m:m.group(1).replace('. ',''),文字)` (2认同)

Tus*_*ani 5

这就是您正在寻找的:

>>> import re

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

>>> m
['.something', '.edu', '.tr']
Run Code Online (Sandbox Code Playgroud)

  • 是的,但问题是你的解决方案即使在OP给出的问题的简化版本上也不起作用。即使对 RegEx 有最基本的了解,您的解决方案对于任何人来说都非常简单。所有其他答案都更加复杂,因为这是一个真正需要解决的重要问题。 (2认同)