正则表达式:除非前导字符匹配,否则匹配IP地址?

6
这个正则表达式 ([a-z0-9]{1,4}:+){3,5}[a-z0-9]{1,4}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 几乎可以匹配所有的IP地址(v4和v6),但不幸的是,对于下面的文本和类似的文本,它也会选中粗体字段:

from mail.example.com (example.com. [213.239.250.131]) by mx.google.com with ESMTPS id xc4si15480310lbb.82.2014.10.26.06.16.58 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 26 Oct 2014 06:16:58 -0700 (PDT)

Received: from ssservices1-1 (192.168.20.142) by mail.supershuttle.com (192.168.20.110) with Microsoft SMTP Server id 14.2.347.0; Tue, 21 Apr 2015

Received: from ssservices1-1 (192.168.20.142) by mail.supershuttle.com (192.168.20.110) with Microsoft SMTP (TLS) Server id 14.2.347.0; Tue, 21 Apr 2015

Received: from plug.mysitehosted.com (plug.mysitehosted.com [10.248.1.153]) (using TLSv1 with cipher DHE-RSA-AES256-SHA) by 0.0.0.0:2500 (trex/5.0.19); Tue, 11 Mar 2014 06:14:03 GMT


有什么最好的方法(我将使用Python)来省略这些匹配?其中两个前面有文本“id”,尽管在第一个案例中,并不是直接在其前面。

2个回答

4
([a-z0-9]{1,4}:+){3,5}[a-z0-9]{1,4}|(?<!id )(?<!\.)\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b(?!\.)

你可以尝试这个。通过使用“lookaheads”,我们确保IP地址不会在前面或后面跟随“.”。请参见演示。 https://regex101.com/r/hI0qP0/3

2

作为额外的提示,您可以添加正向和反向查找。它们将允许您在不消耗任何内容的情况下查看匹配项之前和之后的内容。您的IP始终被()[]包围,因此您可以尝试:

(?<=\[|\()your regex(?=\]|\))

这将匹配你的正则表达式,包括以下两个方面:
(your regex)
[your regex]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接