2014-10-31 57 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