如果您不能使用 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>,]+ - 除空格之外的 1 个或多个字符,, 和 >