【问题标题】:regex to find multiple IP ranges in Python正则表达式在 Python 中查找多个 IP 范围
【发布时间】:2018-09-13 02:16:59
【问题描述】:

将 Python 3 与 Regex 一起使用时,我得到了意想不到的结果。我想做这样的事情

firstpass = re.findall('\s+((10|192|172).\d{1,3}.\d{1,3}.\d{1,3}/(\d+)) ', 行)

它会在哪里查找空格,然后是从 10 或 192 或 172 开始的数字,然后是后面的任意 3 个八位字节(IPv4 地址)。

我了解分组,但我要么只得到前三个值中的一个。或者,如果我改变分组,我会得到 3 个返回(但仍然只有 1 个初始搜索值),我已经尝试了尽可能多的变化。 [10|192|172] 只是不起作用。当然是在 () 分组内。

我正在寻找两个返回字符串。 IP 和掩码。在我尝试扩大表达式以进行更复杂的搜索之前,它工作正常。

最终目标是在一个正则表达式中查找任何私有 IP 空间。

10.match.match.match
172.16-32.match.match
192.168.match.match

所以数据可能看起来像这样,我想拉 1 -3 但不是最后一行

B    10.50.13.0 /26 blah foo
O    192.169.5.0 /24 foo foo
B    172.18.0.0/16 etc etc
B    82.33.4.0/24 yak yak yak

【问题讨论】:

  • 天啊,有史以来最伟大的网站!谢谢你,先生!我需要弄清楚单词的界限,但这确实是我需要的。

标签: regex python-3.x ip


【解决方案1】:

您需要转义所有点(因为您想将它们匹配为文字字符),仅在您希望 re.findall 返回的那些模式周围使用捕获组,并在您不需要它的模式周围使用非捕获组让步,并使用单词边界。

re.findall(r'\b((?:10|192|172)(?:\.\d{1,3}){3}\s*/(\d+))', s)

请参阅regex demo

Python demo

import re
rx = r"\b((?:10|192|172)(?:\.\d{1,3}){3}\s*/(\d+))"
ss = ["B    10.50.13.0 /26 blah foo", "O    192.169.5.0 /24 foo foo", "B    172.18.0.0/16 etc etc", "B    82.33.4.0/24 yak yak yak"]
for s in ss:
    print(s)
    m = re.findall(rx, s)
    if m:
        print(m)
    else:
        print("NO MATCH")

输出:

B    10.50.13.0 /26 blah foo
[('10.50.13.0 /26', '26')]
O    192.169.5.0 /24 foo foo
[('192.169.5.0 /24', '24')]
B    172.18.0.0/16 etc etc
[('172.18.0.0/16', '16')]
B    82.33.4.0/24 yak yak yak
NO MATCH

【讨论】:

  • ?: 除非我让它看起来很原始,否则它不起作用。诡异的。但是是的,这就是有效的。正则表达式测试器非常适合我使用正则表达式的地方。谢谢你。词边界。我感兴趣的新话题:)
  • @Seth 单词边界应定义为r'\b''\\b''\b' 是一个退格字符。非捕获组语法不受字符串文字类型的影响。
猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
相关资源
最近更新 更多