正则表达式:如何在域或IP地址之前省略字符串+空格?

时间:2015-06-04 17:57:34

标签: python regex

以下正则表达式:

(?:X-)?Received: (?:by|from) ([^ \n]+)
对于以下行,

将以粗体匹配文本:

收到:来自mail2.oknotify2.com (mail2.oknotify2.com。[208.83.243.70])mx.google.com,ESMTP ID为dp5si2596299pdb.170.2015.06.03.14.12.03 < / p>

收到:10.66.156.198 ,SMTP码为wg6mr62843415pab.126.1433365924352;

收到:来自localhost (localhost [127.0.0.1])

如果我改变文字,在每一行中删除“收到:”和“收到:来自”,请留下:

from mail2.oknotify2.com (mail2.oknotify2.com. [208.83.243.70]) by mx.google.com with ESMTP id dp5si2596299pdb.170.2015.06.03.14.12.03

by 10.66.156.198 with SMTP id wg6mr62843415pab.126.1433365924352;

from localhost (localhost [127.0.0.1])

如何在此文本中更新正则表达式以匹配IP地址或域(例如mail.oknotify2.com,10.66.156.198)?

我可以将它减少到(?:by|from) ([^ \n]+),这将给我“来自mail.oknotify2.com”,“10.66.156.198”等。但是我如何进行最后一步并省略“by”和“来自”,只留下域/ IP地址?最终的正则表达式也应该像原始一样忽略每行的后续域/ IP,例如mx.google.com在第一行。

3 个答案:

答案 0 :(得分:2)

您可以使用\ K来丢弃之前的匹配项:

(?:X-)?Received: (?:by|from) \K([\S]+)

请参阅Demo

编辑:

就像@James Newton所说的那样,然而所有正则表达式都没有支持,你可以参考这篇文章来看看你的引擎是否支持它:

https://stackoverflow.com/a/13543042/3393095

编辑2:

由于您指定了Python,只需在正则表达式上使用捕获组和re.findall即可,如下所示:

>>> import re
>>> text = ("Received: from mail2.oknotify2.com (mail2.oknotify2.com. [208.83.243.70]) by mx.google.com with ESMTP id dp5si2596299pdb.170.2015.06.03.14.12.03\n"
... "Received: by 10.66.156.198 with SMTP id wg6mr62843415pab.126.1433365924352;\n"
... "Received: from localhost (localhost [127.0.0.1])")
>>> re.findall(r'(?:X-)?Received: (?:by|from) ([\S]+)', text)
['mail2.oknotify2.com', '10.66.156.198', 'localhost']

答案 1 :(得分:1)

我正在撰写答案,因为评论不允许格式化,但@stribizhev给出了正确答案。

@stribizhev提出了这个正则表达式:

^(?:by|from) (\S+)

?:开头的(?:by|from)使其成为非捕获组。 (\S+)是一个捕获组。如果您使用result = string.match(regex)并且匹配,则result将包含["from mail2.oknotify2.com", "mail2.oknotify2.com"]等数组。结果[1]的值是捕获的组。

答案 2 :(得分:1)

您可以使用re.MULTILINE标志启用多行模式,以便在行的开头使用^匹配某些文本。要获得必要的文本,您必须使用捕获组。

遗憾的是,Python正则表达式不支持\K,也不支持可变宽度的后台(使用本机re库)。但是,可以使用可变宽度的后视镜与regex外部库一起使用。

以下是您可以使用的示例代码:

import re
p = re.compile(ur'^(?:by|from) (\S+)', re.MULTILINE)
test_str = u"from mail2.oknotify2.com (mail2.oknotify2.com. [208.83.243.70]) by mx.google.com with ESMTP id dp5si2596299pdb.170.2015.06.03.14.12.03\n\nby 10.66.156.198 with SMTP id wg6mr62843415pab.126.1433365924352;\n\nfrom localhost (localhost [127.0.0.1])"
print [x.group(1) for x in re.finditer(p, test_str)]

a demo program的输出:

[u'mail2.oknotify2.com', u'10.66.156.198', u'localhost']