繁体   English   中英

IP 正则表达式,所有站点都没有子网

[英]IP Regex without subnet for all sites

作为我公司项目的一部分,我需要从某些网站中提取不包括子网划分的 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>

所需的 output 将是:

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)

Output:

['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))

Output:

['212.179.35.154', '201.139.97.126']

(?!\d*\/)部分告诉它“如果后面跟着任何数字和正斜杠,则不匹配前一个模式”。
\d*部分是因为否则它将匹配200.139.97.12 200.139.97.126/24没有6

小提示:您的原始模式将不仅仅匹配合法的 IP 地址,但我选择了您的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM