我正试着解析一些文本文件中的电子邮件。基于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:希望这将消除返回集的单个字符结果,但正如您所看到的,它不起作用。为什么不行?我怎么才能解决这个问题才能得到真正的电子邮件呢?
发布于 2014-10-31 02:37:47
你不需要检查长度。在两个捕获组之间转换为非捕获组,如下所示。
([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])?)
^ ^
| |演示
发布于 2014-10-31 02:43:07
如果仔细查看您发送的链接中的程序(第28行),您会发现它们只使用regex结果元组的第一个元素。
所以你可能想要改变这个:
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])...or只是改变了正则表达式
https://stackoverflow.com/questions/26666700
复制相似问题