在python正则表达式中捕获重复的组

时间:2017-10-06 10:34:52

标签: python regex

我有一个邮件日志文件,如下所示:

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'.+?@(.*?)[>, ]')将返回正确的列表,但我也需要过滤。有没有解决方法呢?

2 个答案:

答案 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']

忽略第一个空匹配。

https://regex101.com/r/7zPc6j/1

答案 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 demoregex demo

模式详情

  • (?:^(?=.*sm-mta)|\G(?!^)) - 除了换行符之外的任何0+字符之后具有sm-mta子字符串的行,或上一个匹配结束的位置
  • .*?@ - 除了换行符之外的任何0 +字符,尽可能少,直到@@本身
  • \K - 匹配重置运算符,丢弃当前迭代中到目前为止匹配的所有文本
  • [^\s>,]+ - 除空格以外的一个或多个字符,>