簡體   English   中英

如何使用Python正則表達式從字符串中提取未知數量的不同部分?

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

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