[英]Capturing repeating subpatterns in Python regex
在匹配 email 地址時,在匹配yasar@webmail
類的內容后,我想捕獲一個或多個(\.\w+)
(我所做的有點復雜,這只是一個例子),我試過了添加 (.\w+)+,但它只捕獲最后一個匹配項。 例如, yasar@webmail.something.edu.tr
@webmail.something.edu.tr 匹配但僅在yasar@webmail
部分之后包含.tr
,因此我丟失了.something
和.edu
組。 我可以在 Python 正則表達式中執行此操作,還是您建議首先匹配所有內容,然后再拆分子模式?
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 的回答中的代碼。
這將起作用:
>>> 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']
請注意,只要電子郵件地址很簡單,regexp 就可以了 - 但是這會破壞各種事情。 有關電子郵件地址正則表達式的詳細處理,請參閱此問題。
您可以通過執行以下操作來解決(\\.\\w+)+
僅捕獲最后一個匹配項的問題: ((?:\\.\\w+)+)
這就是你要找的:
>>> import re
>>> s="yasar@webmail.something.edu.tr"
>>> r=re.compile("\.\w+")
>>> m=r.findall(s)
>>> m
['.something', '.edu', '.tr']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.