在匹配电子邮件地址时,在我匹配之后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就可以了 - 但是有很多东西会破坏它们.有关电子邮件地址正则表达式的详细处理,请参阅此问题.
您可以(\.\w+)+通过执行此操作来解决仅捕获最后一个匹配的问题:((?:\.\w+)+)
这就是您正在寻找的:
>>> 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)
| 归档时间: |
|
| 查看次数: |
34865 次 |
| 最近记录: |