文章目录
引言:
在使用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呢?各位大佬欢迎评论。。。