2014-10-31 78 views
0

我試圖從文本文件中解析某些電子郵件。基於https://gist.github.com/dideler/5219706,我有:如何防止將短字符串添加到集合

def getEmails(freeText): 

    r = re.compile(("([a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`" 
         "{|}~-]+)*(@|\sat\s)(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(\.|" 
         "\sdot\s))+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)")) 

    results = r.findall(freeText) 
    myset = set() # USING A SET AVOIDS DUPLICATES 
    for x in results: 
     if len(x)>2: 
      myset.add(str(x)) 

    return myset 

這工作得很好,但我得到了一組返回,看起來像:

"('[email protected]', '@', '.') 

我加了一行:

if len(x)>2: 

希望這會消除返回集中的單個字符結果,但正如你可以看到它不起作用。爲什麼不?我該如何解決這個問題才能得到真正的電子郵件?

回答

2

您不需要檢查長度。將兩個捕獲組轉換爲下面的非捕獲組。

([a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*(?:@|\sat\s)(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.|\sdot\s))+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?) 
                   ^           ^
                    |            | 

DEMO

+0

要命阿維納什,這一工程!我沒有經驗過正則表達式,你會介意解釋你做了什麼嗎?最好 - 比爾 – user61629 2014-10-31 02:54:55

+0

're.findall'首先給予這些羣體。如果沒有找到捕獲組,只有它會打印匹配。你原來的正則表達式包含三個捕獲組。一個捕獲整個電子郵件地址,另一個捕獲點,然後另一個捕獲'@'符號。所以你得到三個部分。我只是將捕獲「@」的捕獲組和「點」變成非捕獲組。所以最後我們有一個捕獲組。現在找到打印出現在該單個組中的內容。 – 2014-10-31 03:00:27

+0

非常感謝 – user61629 2014-10-31 03:52:24

1

如果你在你發送(第28行)的鏈接程序仔細觀察,你可以看到,他們只是利用正則表達式的結果的元組的第一個元素。

所以,你可能想改變這一點:

for x in results: 
    if len(x)>2: 
     myset.add(str(x)) 

到:

​​

...或只是改變正則表達式

+0

謝謝你的幫助 – user61629 2014-10-31 02:56:23

相關問題