作为我公司项目的一部分,我需要从一些网站中提取不包括子网的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/])
,我们说:排除后面跟有0
或1
或2
或3
或4
或5
或6
或7
或8
或9
或/
的匹配。请注意,在这里包括数字是至关重要的,因为如果您只指定/其中一个匹配项为:
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地址,但我同意您的方式。