如何使用REGEX在长字符串中查找IP地址

2024-09-28 22:41:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何从一个很长的字符串中只提取正确的IP地址。 问题是,我的代码提取的IP地址,即使它的一部分有超过3位数字(这是不正确的)。你知道吗

我试图学习更多关于python正则表达式的知识,但我不知道如何在一个点后最多连续3位数字处停止它。 我的意思是,如果IP是1.2.3.4,它会正确地找到它,这确实是正确的,但是如果IP是1.2.3.4567,它也会正确地找到它,这是不正确的。我不知道怎么说,如果一个组有3个以上的数字,那就不是IP地址了。你知道吗

import re

secv = "akmfiawnmgisa gisamgisamgsagr[sao l321r1m r2p4 2342po4k2m4 22.33.4.aer 1.2.3.5344 99.99.99.100 asoifinagf sadgsangidsng sg"

b = re.findall(r"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.\d{1,3}",secv)

print(b)

它打印1.2.3.534499.99.99.100,但1.2.3.5344不是IP地址,因为它有3个以上的连续数字


Tags: 字符串代码importipre数字saoaer
2条回答

只需搜索出现4次的模式[1-2]?[0-9]{1,2},中间用一个点隔开。可以选择在regex模式的开头和结尾使用单词边界

>>> re.findall(r'\b(?:[1-2]?[0-9]{1,2}\.){3}[1-2]?[0-9]{1,2}\b', secv)
['99.99.99.100']                                                      
import re

secv = "90.123.1.100 akmfiawnmgisa gisamgisamgsagr[sao l321r1m r2p4 2342po4k2m4 22.33.4.aer 1.2.3.5344 99.99.99.100 asoifinagf sadgsangidsng sg 13.18.19.100 1.2.3.4"

b = re.findall(r"(?:\s|\A)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?=\s|\Z)",secv)

b = list(filter(lambda x: all([int(y) <= 255 for y in x.split('.')]), b))


print(b)

为了更有趣,我在字符串的开头和结尾添加了IP地址。我假设如果不是在字符串的开头或结尾,ip地址需要在两边用空格隔开。因此,我在REGEX的开头添加了一个非捕获组(?:\s |\A)将匹配字符串开头的空格字符。我还在REGEX的末尾添加了一个lookahead断言(?=\s |\Z)将匹配单个空格字符或行尾,而不消耗任何字符。上面打印出来:

['90.123.1.100', '99.99.99.100', '13.18.19.100', '1.2.3.4']

相关问题 更多 >