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