[英]How to extract unknown number of different parts from string with Python regex?
有誰知道使用Python正則表達式從字符串中提取未知數量的不同部分的明智方法嗎?
我知道這個問題可能太籠統而無法清楚地回答,所以請讓我們看一下示例:
S = "name.surname@sub1.sub2.sub3"
結果,我想分別獲得一個本地部分和每個子域。 請注意,在此示例電子郵件地址中,我們有三個子域,但是我想找到一個能夠捕獲任意數量的正則表達式,因此請不要使用該數字。 為了避免從零開始,我們另外假設電子郵件地址中僅允許使用字母數字字符(因此\\w
),點和一個@。
我試圖自己解決它,發現這種方式:
L = re.findall(r"([\w.]+)(?=@)|(\w+)", S)
for i in L:
if i[0] == '': print i[1],
else: print i[0],
# output: name.surname sub1 sub2 sub3
但這對我來說並不好。 有誰知道一種使用一個正則表達式且沒有任何循環的方法?
當然,無需正則表達式,我們可以輕松實現:
L = S.split('@')
localPart = L[0] # name.surname
subdomains = str(L[1]).split('.') # ['sub1', 'sub2', 'sub3']
但是我對如何使用正則表達式感興趣。
[編輯]
烏夫,終於我弄清楚了,這是一個不錯的解決方案:
S = "name.surname@sub1.sub2.sub3"
print re.split(r"@|\.(?!.*@)", S) # ['name.surname', 'sub1', 'sub2', 'sub3']
S = "name.surname.nick@sub1.sub2.sub3.sub4"
print re.split(r"@|\.(?!.*@)", S) # ['name.surname.nick', 'sub1', 'sub2', 'sub3', 'sub4']
完美的輸出。
如果我正確地理解了您的請求,則希望在示例電子郵件地址中找到每個部分,但不要加上句點。 樣本正則表達式片段中缺少的是re.compile
。 例如:
import re
s = "name.surname@sub1.sub2.sub3"
r = "\w+"
r2 = re.compile(r)
re.findall(r2,s)
這將在字符串s
查找r2
正則表達式對象,並輸出['name', 'surname', 'sub1', 'sub2', 'sub3']
。
基本上,您可以使用以下事實:當模式中存在捕獲組時, re.findall
僅返回此捕獲組的內容, re.findall
返回整個匹配項:
>>> re.findall(r'(?:^[^@]*@|\.)([^.]*)', s)
['sub1', 'sub2', 'sub3']
顯然,電子郵件格式比示例字符串要復雜。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.