我正在尝试解析文本文件中的一些电子邮件。基于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:
希望这会消除返回集合中的单个字符结果,但是你可以看到它不起作用。为什么不?如何解决此问题才能获得真正的电子邮件?
答案 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])?)
^ ^
| |
答案 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])
...或者只是更改正则表达式