【问题标题】:How to find an IP pattern in a string如何在字符串中查找 IP 模式
【发布时间】:2019-12-21 09:03:18
【问题描述】:

我正在尝试在字符串中查找 IP 模式或任何类似模式。例如:

Text_1 = "您好,此 ip 有效:123.22.33.22,但是!" #expect 123.22.33.22

Text_2 = "这可能是第二个有效 ip: 323.123.22.33.22 ,但是!" #expect 323.123.22.33.22

Text_3 = "第三个模式是:01.002.33.222,但是!" #expect 01.002.33.222

Text_4 = "第四个模式是:332.332.222,但是!" #expect 332.332.222

在所有情况下,我都需要提取所有以点分隔的数字,然后评估它们是否可能有效。

我查看了this question 和this question,但都有一些问题!

这是我发现的,但不能完美地工作,因为它无法捕获超过 4 位的字符串:

import re
re.search(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', s).group()

【问题讨论】:

  • 这很令人困惑,因为其中大多数不是有效的 IP 地址。
  • 如果您只是在寻找点状数字序列,\d+(\.\d+)* 怎么样?
  • 是的,我正在尝试提取这些数字以便稍后评估它们是否是有效的 IP。因为上述链接中的任何解决方案都没有提供验证 IP 的有效解决方案,这就是我尝试首先提取数字的原因
  • r"(\d+).(\d+).(\d+).(\d+)" ?
  • 你确定你还需要323.123.22.33.22吗?

标签: python


【解决方案1】:

如果你想要任何个数字和点的序列,试试这个:

# Find a number, then one or more ".numbers"
re.search(r'(\d+)(\.(\d+))+', Text_2).group()

它给出:

'323.123.22.33.22'

注意:提取候选后,可以使用this answer提供的正则表达式进行检查。

【讨论】:

  • @Readers,我应该更多地解释正则表达式吗?或者更多的例子?事实上,答案可能不太有用......
【解决方案2】:

怎么样: map(int, “167.78.2.99”.split(“.”))) (由 . 分割并尝试将每个转换为整数)并检查类型错误,检查 len() 是否为 4并检查每个元素 0

抱歉没有代码,不在我的电脑上

【讨论】:

  • 感谢您的回答,但是您是如何从我提供的字符串中提取 4 位/5 位/3 位数字的?
  • 哎呀,没有很好地阅读这个问题,我想你可以使用答案 1,或者如果你不喜欢 re,分割空格,检查每个单词并去掉除数字和之外的任何内容使用我提供的代码。
【解决方案3】:

这会找到确切的 IP 地址:

^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$

https://regex101.com/r/3biYkC/1

更新,我给它加了一个词边界,它似乎工作:

\b(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}\b

https://regex101.com/r/3biYkC/2

【讨论】:

  • 但是它如何从原始字符串中提取 IP 地址呢?这绝对可以在提取可能的匹配项之后应用。
  • @JaideepShekhar 没错,我会考虑一下并制作一个可以在任何地方找到的新版本。
  • @JaideepShekhar 检查第二个,它似乎运作良好。您可以在 regex101 站点测试更多案例
  • 大声笑。通过忽略 - 来匹配 -25.1.3.2。我们是否也应该检查正则表达式中的减号?
  • 大声笑,您可以在 \b 之后添加一个空格,以不匹配连接的 IP 接触其他内容。 idk,我敢肯定还有更多工作要做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多