如何防止短字符串被添加到

2024-10-03 21:35:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

希望这将从返回的集合中消除单个字符的结果,但是正如您所看到的,它不起作用。为什么不呢?我怎样才能解决这个问题,只收到真正的电子邮件


Tags: httpsgithubcomlenif电子邮件defresults
2条回答

如果仔细查看您发送的链接(第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])

…或者只是换个正则表达式

你不需要检查长度。在两个捕捉组之间转入非捕捉组,如下所示

([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

相关问题 更多 >