我有一个邮件日志文件,如下所示:
Aug 15 00:01:06 **** sm-mta*** to=<user1@gmail.com>,<user2@yahoo.com>,user3@aol.com, some_more_stuff
Aug 16 13:16:09 **** sendmail*** to=<user4@yahoo.com>, some_more_stuff
Aug 17 11:14:48 **** sm-mta*** to=<user5@gmail.com>,<user6@gmail.com>, some_more_stuff
我想要的是包含&#34; sm-mta&#34;的行中所有邮件主机的列表。在这种情况下,将是:['gmail.com', 'yahoo.com', 'aol.com', 'gmail.com', gmail.com']
re.findall(r'sm-mta.*to=.+?@(.*?)[>, ]')
将仅返回每个匹配行(['gmail.com','gmail.com']
)
re.findall(r'.+?@(.*?)[>, ]')
将返回正确的列表,但我也需要过滤。有没有解决方法呢?
答案 0 :(得分:3)
试试regex
模块。
x="""Aug 15 00:01:06 **** sm-mta*** to=<user1@gmail.com>,<user2@yahoo.com>,user3@aol.com, some_more_stuff
Aug 16 13:16:09 **** sendmail*** to=<user4@yahoo.com>, some_more_stuff
Aug 17 11:14:48 **** sm-mta*** to=<user5@gmail.com>,<user6@gmail.com>, some_more_stuff"""
import regex
print regex.findall(r"sm-mta.*to=\K|\G(?!^).+?@(.*?)[>, ]", x, version=regex.V1)
输出:
['', 'gmail.com', 'yahoo.com', 'aol.com', '', 'gmail.com', 'gmail.com']
忽略第一个空匹配。
答案 1 :(得分:1)
如果您不能使用PyPi正则表达式库,则必须分两步执行:1)使用sm-mta
抓取行,然后2)获取所需的值,例如
导入重新
txt="""Aug 15 00:01:06 **** sm-mta*** to=<user1@gmail.com>,<user2@yahoo.com>,user3@aol.com, some_more_stuff
Aug 16 13:16:09 **** sendmail*** to=<user4@yahoo.com>, some_more_stuff
Aug 17 11:14:48 **** sm-mta*** to=<user5@gmail.com>,<user6@gmail.com>, some_more_stuff"""
rx = r'@([^\s>,]+)'
filtered_lines = [x for x in txt.split('\n') if 'sm-mta' in x]
print(re.findall(rx, " ".join(filtered_lines)))
请参阅Python demo online。 @([^\s>,]+)
模式将与@
匹配,并将捕获并返回除空格>
和,
以外的任何1个字符。
如果你可以使用PyPi正则表达式库,你可以获得你需要的字符串列表
>>> import regex
>>> x="""Aug 15 00:01:06 **** sm-mta*** to=<user1@gmail.com>,<user2@yahoo.com>,user3@aol.com, some_more_stuff
Aug 16 13:16:09 **** sendmail*** to=<user4@yahoo.com>, some_more_stuff
Aug 17 11:14:48 **** sm-mta*** to=<user5@gmail.com>,<user6@gmail.com>, some_more_stuff"""
>>> rx = r'(?:^(?=.*sm-mta)|\G(?!^)).*?@\K[^\s>,]+'
>>> print(regex.findall(rx, x, regex.M))
['gmail.com', 'yahoo.com', 'aol.com,', 'gmail.com', 'gmail.com']
请参阅the Python online demo和regex demo。
模式详情
(?:^(?=.*sm-mta)|\G(?!^))
- 除了换行符之外的任何0+字符之后具有sm-mta
子字符串的行,或上一个匹配结束的位置.*?@
- 除了换行符之外的任何0 +字符,尽可能少,直到@
和@
本身\K
- 匹配重置运算符,丢弃当前迭代中到目前为止匹配的所有文本[^\s>,]+
- 除空格以外的一个或多个字符,
和>