以下正则表达式:
(?: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
收到:10.66.156.198,SMTP id wg6mr62843415pab.126.1433365924352;
收到:来自本地主机(本地主机 [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]+)
这样我就会得到“from mail.oknotify2.com”、“by 10.66.156.198”等。但是我如何进行最后一步并省略“by”和“from”,只留下域/IP 地址?最终的正则表达式也应该像原来的那样,忽略每行中存在的后续域/IP,例如mx.google.com 在第一行。
最佳答案
您可以使用\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']
关于python - 正则表达式:如何在域或 IP 地址之前省略字符串 + 空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30650898/