以下正则表达式:
(?: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在第一行。
答案 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']