如何防止将短字符串添加到集合中

时间:2014-10-31 02:33:26

标签: python regex string

我正在尝试解析文本文件中的一些电子邮件。基于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

这很好用,但是我得到了一个返回的集合,如下所示:

"('myname@abc.org', '@', '.')

我添加了一行:

if len(x)>2:

希望这会消除返回集合中的单个字符结果,但是你可以看到它不起作用。为什么不?如何解决此问题才能获得真正的电子邮件?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果你仔细查看你发送的链接中的程序(第28行),你会发现它们只使用了正则表达式结果的元组的第一个元素。

所以你可能想要改变这个:

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

成:

for x in results:        
    if len(x[0])>2:
        myset.add(x[0])

...或者只是更改正则表达式