簡體   English   中英

在 Python 正則表達式中捕獲重復的子模式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM