Python 如何防止向集合中添加短字符串

Python 如何防止向集合中添加短字符串,python,regex,string,Python,Regex,String,我正试图解析一些来自文本文件的电子邮件。基于此,我有: def getEmails(freeText): r = re.compile(("([a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`" "{|}~-]+)*(@|\sat\s)(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(\.|"

我正试图解析一些来自文本文件的电子邮件。基于此,我有:

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:

希望这将从返回的集合中消除单字符结果,但正如您所看到的,它不起作用。为什么不呢?如何修复此问题以仅获取真实电子邮件?

您无需检查长度。在两个捕获组之间切换为非捕获组,如下所示

([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])?)
                                                                   ^                                              ^
                                                                   |                                              |

您不需要检查长度。在两个捕获组之间切换为非捕获组,如下所示

([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])?)
                                                                   ^                                              ^
                                                                   |                                              |

您不需要检查长度。在两个捕获组之间切换为非捕获组,如下所示

([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])?)
                                                                   ^                                              ^
                                                                   |                                              |

您不需要检查长度。在两个捕获组之间切换为非捕获组,如下所示

([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])?)
                                                                   ^                                              ^
                                                                   |                                              |

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

因此,您可能希望更改此设置:

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


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

如果仔细查看发送的链接(第28行)中的程序,可以看到它们仅使用正则表达式结果元组的第一个元素

因此,您可能希望更改此设置:

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


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

如果仔细查看发送的链接(第28行)中的程序,可以看到它们仅使用正则表达式结果元组的第一个元素

因此,您可能希望更改此设置:

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


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

如果仔细查看发送的链接(第28行)中的程序,可以看到它们仅使用正则表达式结果元组的第一个元素

因此,您可能希望更改此设置:

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


…或者只需更改正则表达式

Awsome Avinash,就行了!我对正则表达式没有经验,你能解释一下你做了什么吗?最佳-Bill
re.findall
优先考虑各组。如果没有找到捕获组,则只有它会打印匹配项。原始正则表达式包含三个捕获组。一个捕获整个电子邮件地址,另一个捕获点,然后另一个捕获
@
符号。所以你得到了三个部分。我只是将捕获
@
和点的捕获组转换为非捕获组。最后我们有一个单独的捕获组。现在芬德尔打印出这一组中的内容。啊,阿维纳什,行了!我对正则表达式没有经验,你能解释一下你做了什么吗?最佳-Bill
re.findall
优先考虑各组。如果没有找到捕获组,则只有它会打印匹配项。原始正则表达式包含三个捕获组。一个捕获整个电子邮件地址,另一个捕获点,然后另一个捕获
@
符号。所以你得到了三个部分。我只是将捕获
@
和点的捕获组转换为非捕获组。最后我们有一个单独的捕获组。现在芬德尔打印出这一组中的内容。啊,阿维纳什,行了!我对正则表达式没有经验,你能解释一下你做了什么吗?最佳-Bill
re.findall
优先考虑各组。如果没有找到捕获组,则只有它会打印匹配项。原始正则表达式包含三个捕获组。一个捕获整个电子邮件地址,另一个捕获点,然后另一个捕获
@
符号。所以你得到了三个部分。我只是将捕获
@
和点的捕获组转换为非捕获组。最后我们有一个单独的捕获组。现在芬德尔打印出这一组中的内容。啊,阿维纳什,行了!我对正则表达式没有经验,你能解释一下你做了什么吗?最佳-Bill
re.findall
优先考虑各组。如果没有找到捕获组,则只有它会打印匹配项。原始正则表达式包含三个捕获组。一个捕获整个电子邮件地址,另一个捕获点,然后另一个捕获
@
符号。所以你得到了三个部分。我只是将捕获
@
和点的捕获组转换为非捕获组。最后我们有一个单独的捕获组。现在findall打印出了这一组中的内容。