作为我公司项目的一部分,我需要从一些网站提取不包括子网(例如196.82.1.12/24)的IP地址。
如果地址包含子网,我不想抓住进行子网的部分,但根本不接受它。
例如,在以下情况下:
<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}[^\/]然而,它们的内部似乎都有缺陷。
提前感谢!
发布于 2020-07-28 09:29:05
您可以使用,通过使用模式语法(?!...),如下所示:
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'](?!\d*\/)部分告诉它“如果后面跟着任何数字和正斜杠,就不匹配前面的模式”。
( \d*部分是因为否则它将在200.139.97.126/24之外匹配200.139.97.12 (没有6) )
注意:你的原始模式将不仅仅是合法的IP地址匹配,但我同意你的方式。
发布于 2020-07-28 09:29:49
对我来说,这似乎是一项负展望的任务。我会这样做:
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 )
https://stackoverflow.com/questions/63130866
复制相似问题