Python正则表达式:从字符串中识别IPv4地址

5

我在从字符串中提取IPv4地址方面遇到了困难。


我的输入字符串和约束条件如下:

  • IPv4范围:0.0.0.0255.255.255.255
  • IPv4地址可能存在于字符串中,也可能不存在
    • 有效示例:this is an ipthis is an ip 200.100.2.32
  • 字符串可能以IPv4地址开头
    • 有效示例:200.100.2.32 is an ip | 输出:['200.100.2.32']
    • 无效示例:200.100.2.32is an ip | 输出:[]
  • 字符串可能以IPv4地址结尾
    • 有效示例:the ip is 200.100.2.32 | 输出:['200.100.2.32']
    • 无效示例:the ip is200.100.2.32 | 输出:[]
  • 字符串可能在中间包含IPv4地址,如果有,则IPv4地址前后会有一个空格。
    • 有效示例:the ip is 200.100.2.32 and it is ipv4 | 输出:['200.100.2.32']
    • 有效示例:the ip is 200.100.2.32and it is ipv4 | 输出:[]
  • 单个字符串中可能存在多个IP
    • 有效示例:200.100.2.32 100.50.1.16 | 输出:['200.100.2.32', '100.50.1.16']
    • 无效示例:200.100.2.32.100.50.1.16 | 输出:[]

我正在尝试为上述情况构建正则表达式,它们看起来非常简单,但我无法将所有正则表达式检查都整合在一起。

我一直在参考这些链接上的答案:链接1链接2链接3


有人能帮我指明正确的方向吗?总结一下:

  • IPv4前面会有一个空格或者出现在字符串的开头
  • IPv4后面会有一个空格或者出现在字符串的结尾
  • IPv4的范围是:0.0.0.0255.255.255.255

代码

def find_ip(str) :
    ip_pattern = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s') # need to strengthen the regex here
    ip = re.findall(ip_pattern, str)
    return ip

你写了什么代码? - Thomas Junk
ipaddress模块对你有帮助吗?可以使用split函数拆分字符串,并尝试对每个拆分后的字符串调用IPv4Address - Navith
你已经完成了IP地址。现在只需要正则表达式。你需要0个或多个,它可以出现在字符串的开头或空格后面等位置。个人而言,我会为每种情况制作单独的正则表达式并交替使用它们,但我不是正则表达式专家! - saulspatz
@saulspatz - 你不需要多个正则表达式... - TigerhawkT3
我没有看到任何需要简化的内容。只需使用链接的重复表达式,它就能够在字符串中找到任何IP地址。 - TigerhawkT3
显示剩余2条评论
1个回答

2

正则表达式:

(?:^|\b(?<!\.))(?:1?\d\d?|2[0-4]\d|25[0-5])(?:\.(?:1?\d\d?|2[0-4]\d|25[0-5])){3}(?=$|[^\w.])

一个匹配的示例

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接