记一次使用python.re库中findall遇到的坑

文章讲述了在Python中使用re库处理IPv4地址时,如何克服findall方法在存在分组时无法匹配整体的问题,通过改变正则表达式的写法实现全局匹配,并讨论了如何处理不合法IP的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

引言:
在使用python中re库匹配IPv4时,我需要整体匹配一个大的字符串中所有的Ip地址,需要用findall而不是search。但是,findall在存在分组的情况下默认无法匹配整体,这个问题该如何解决呢?

我使用的pattern为:

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

代码为:

import re



def judge(IP: str = '127.0.0.1'):
    """
    判断一个字符串中是否存在IP地址
    :param IP: IP 字符串
    :return: 如果存在,返回所有的IP地址,如果不存在,返回False
    """

    pattern = r'((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d| 2[0-4]\d|25[0-5])'
    
    pattern_compiled = re.compile(pattern, re.M)
    
    contents = IP
    
    res = pattern_compiled.findall(string = contents)
    
    if res:
        return res
    else:
        return False
    
    
if __name__ == '__main__':
    print(judge('127.0.0.1'))

运行结果:
在这里插入图片描述
这里使用findall根本无法匹配整体。怎么办呢?
首先,想到使用search方法, 这样的确可以匹配到第一个
在这里插入图片描述
但是,我的例子中如果有多个IP地址需要提取呢?总不能一个一个用group提取吧?
通过查阅大佬的资料,发现了一种新的用法,就是把()改成不匹配模式,具体该如何做呢?请看代码

import re



def judge(IP: str = '127.0.0.1'):
    """
    判断一个字符串中是否存在IP地址
    :param IP: IP 字符串
    :return: 如果存在,返回所有的IP地址,如果不存在,返回False
    """

    pattern = r'(?:(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d\d| 2[0-4]\d|25[0-5])'
    
    pattern_compiled = re.compile(pattern, re.M)
    
    contents = IP
    
    res = pattern_compiled.findall(string = contents)
    
    if res:
        return res
    else:
        return False
    
    
if __name__ == '__main__':
    print(judge('127.0.0.1demo,192.168.1.1, 290.0.0.4'))

运行结果如下:
在这里插入图片描述
这样将IP提取出来啦😄
这里还有一个问题,如果我要提取的是290.0.0.4这种不合法的IP呢?示例中将2和90分开了,那该如何提取290呢?各位大佬欢迎评论。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只菜鸟呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值