所有站点的不带子网的IP Regex



作为我公司项目的一部分,我需要从一些网站中提取不包括子网的IP地址(例如196.82.1.12/24(。

如果地址包含子网,我不想抓住进行子网但根本不接受的部分。

例如以下情况:

<td>212.179.35.154</td>
<td>200.139.97.126/24</td>
<td>"201.139.97.126"</td>
<td>F5 BIG-IP</td>
<td>unknown</td>
<td class="date">26-Feb-2011</td>

所需输出为:

212.179.35.154

201.139.97.126

请注意,有些行包括IP地址周围的引号,但由于没有以下/NUMBER,它们是有效的。

我现在正试图找到一个合适的正则表达式,例如:

(<td>(d+.){3}d+</td>)
d{1,3}.d{1,3}.d{1,3}.d{1,3}[^/]

然而,所有这些似乎都有一个缺陷。

提前感谢!

对我来说,这看起来像是一项负前瞻性任务。我会做:

import re
txt = '''<td>212.179.35.154</td>
<td>200.139.97.126/24</td>
<td>"201.139.97.126"</td>
<td>F5 BIG-IP</td>
<td>unknown</td>
<td class="date">26-Feb-2011</td>'''
pattern = r"d{1,3}.d{1,3}.d{1,3}.d{1,3}(?![0-9/])"
found = re.findall(pattern, txt)
print(found)

输出:

['212.179.35.154', '201.139.97.126']

通过使用负前瞻(?![0-9/]),我们说:排除后面跟有0123456789/的匹配。请注意,在这里包括数字是至关重要的,因为如果您只指定/其中一个匹配项为:

200.139.97.12

(钞票末尾缺少6(

通过使用模式语法(?!...),可以使用否定前瞻断言,如下所示:

import re
s = """
<td>212.179.35.154</td>
<td>200.139.97.126/24</td>
<td>"201.139.97.126"</td>
<td>F5 BIG-IP</td>
<td>unknown</td>
<td class="date">26-Feb-2011</td>
"""
pattern = r"d{1,3}.d{1,3}.d{1,3}.d{1,3}(?!d*/)"
print(re.findall(pattern,s))

输出:

['212.179.35.154', '201.139.97.126']

CCD_ 15部分告诉;如果后面跟有任何数字和一个正斜杠,就不要匹配前面的模式
(d*部分是因为否则它将匹配200.139.97.126/24中的200.139.97.12(没有6((

小提示:您最初的模式将匹配的不仅仅是合法的IP地址,但我同意您的方式。

最新更新