我正在尝试解析日志文件以提取电子邮件地址。 我能够匹配电子邮件并在正则表达式的帮助下打印它。 我注意到我的日志文件中有几封重复的电子邮件。你能帮我弄清楚如何删除重复,并根据匹配的模式只打印唯一的电子邮件地址吗。在
以下是我目前编写的代码:
import sys
import re
file = open('/Users/me/Desktop/test.txt', 'r')
temp =[]
for line in file.readlines():
if '->' in line:
temp = line.split('->')
elif '=>' in line:
temp = line.split('=>')
if temp:
#temp[1].strip()
pattern = re.match('^\x20\w{1,}@\w{1,}\.\w{2,3}\x20?', str(temp[1]), re.M)
if pattern is not None:
print pattern.group()
else:
print "nono"
下面是我要解析的日志文件示例:
Feb 24 00:00:23 smtp1.mail.net exim[5660]: 2014-02-24 00:00:23 1Wuniq-mail-idSo-Fg -> someuser@somedomain.com R=mail T=remote_smtp H=smtp.mail.net [000.00.34.17]
Feb 24 00:00:23 smtp1.mail.net exim[5660]: 2014-02-24 00:00:23 1Wuniq-mail-idSo-Fg -> someuser@somedomain.com R=mail T=remote_smtp H=smtp.mail.net [000.00.34.17]
Feb 24 00:00:23 smtp1.mail.net exim[5661]: 2014-02-24 00:00:23 1Wuniq-mail-idSm-1h => someuser@somedomain.com R=mail T=pop_mail_net H=mta.mail.net [000.00.34.6]
Feb 24 00:00:23 smtp1.mail.net exim[5661]: 2014-02-24 00:00:23 1Wuniq-mail-idSm-1h => me@somedomain.com R=mail T=pop_mail_net H=mta.mail.net [000.00.34.6]
Feb 24 00:00:23 smtp1.mail.net exim[5661]: 2014-02-24 00:00:23 1Wuniq-mail-idSm-1h => wo@somedomain.com R=mail T=pop_mail_net H=mta.mail.net [000.00.34.6]
Feb 24 00:00:23 smtp1.mail.net exim[5661]: 2014-02-24 00:00:23 1Wuniq-mail-idSm-1h => lol@somedomain.com R=mail T=pop_mail_net H=mta.mail.net [000.00.34.6]
Feb 24 00:00:23 smtp1.mail.net exim[5661]: 2014-02-24 00:00:23 1Wuniq-mail-idSm-1h Completed
另外,我很好奇我是否可以改进我的程序或正则表达式。任何建议都会很有帮助。在
提前谢谢。在
正如danidee(他是第一个)说的,set会做到的
试试这个:
输出:
^{pr2}$PS你可能想做一个正确的电子邮件RegExp检查,因为我使用了非常原始的检查
有些重复是由于代码中的错误导致的,在处理每一行时没有重置
temp
。如果不包含->
或=>
,并且前面有一行不包含这两个字符串中的任何一个,则该行将触发if temp:
测试,如果上一行有,则输出上一行的电子邮件地址。在当行既不包含
->
也不包含=>
时,可以通过跳回循环的开始来修复这个问题。在对于由于同一电子邮件地址出现在多行中而出现的其他真实重复,可以使用
set
过滤掉。在这些地址存储在一个集合中以消除重复。然后对它们进行分类和打印。还要注意使用
with
语句在上下文管理器中打开文件。这保证文件将始终关闭。在另外,由于您将多次应用相同的regex模式,因此为了提高效率,有必要提前编译它。在
使用正确编写的regex模式,您的代码可以大大简化:
^{pr2}$您可以使用
set
容器来保存唯一的结果,每次要打印匹配的电子邮件时,您可以检查邮件集中是否不存在,然后打印它:相关问题 更多 >
编程相关推荐