Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用正则表达式在长字符串中查找IP地址?_Python_Python 3.x_Regex - Fatal编程技术网

Python 如何使用正则表达式在长字符串中查找IP地址?

Python 如何使用正则表达式在长字符串中查找IP地址?,python,python-3.x,regex,Python,Python 3.x,Regex,我想知道如何从一个很长的字符串中提取正确的IP地址。 问题是,我的代码提取的IP地址,即使它的一部分有超过3位数字(这是不正确的) 我试图学习更多关于Python正则表达式的知识,但我不知道如何在点后最多连续3位停止它。 我的意思是,如果IP是1.2.3.4,它会正确地找到它,这确实是正确的,但是如果IP是1.2.3.4567,它也会正确地找到它,这是不正确的。我不知道该怎么说,如果一个组有3个以上的数字,那就不是IP地址了 import re secv = "akmfiawnmgi

我想知道如何从一个很长的字符串中提取正确的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.5344
,也打印
99.99.99.100
,但
1.2.3.5344
不是IP地址,因为它有3个以上的连续数字。

只需搜索模式
[1-2]?[0-9]{1,2}
,出现4次,以点分隔。(可选)在开始和结束处使用单词边界锚定正则表达式模式

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

可能的副本只需要一些边界,比如$or\s,\b来包装有效的IP:
\b[0-9]{1,3}\[0-9]{1,3}\[0-9]{1,3}\.\d{1,3}\b
它不打印1.2.3.5344。但是,它会打印1.2.3.534,这是正则表达式的有效表达式(但不是有效的IP地址,因为它高于255)。问题是它后面跟着另一个数字。您可以使用“向前看”并要求下一个字符不是数字,以避免找到1.2.3.534,如果这是您想要的。谢谢,IWHKYB!成功了。但是JohanL,我如何检查下一个字符是不是数字?它工作了,但是它也考虑了IP地址的顺序,比如*/122.1212,那些字符在12之前。因此,我在seq的末尾加了“+”,以检查ip地址是否被空格包围。这对于ip地址来说是无效的正则表达式。例如,它将匹配
999.999.999.999
…@R2RT,这是非常正确的。如果您查看REGEX以获得完全有效的IP,那么它相当长。这个问题的主要目的是确保您不会无意中得到最后一个4位数的组件。因此,我提供的服务的重点是测试所需字符串所在的上下文。处理更彻底的测试的另一种方法是运行上述正则表达式,然后通过在“.”字符上拆分每个结果并确保每个组件为255或更少(或任何规则)。@R2RT我返回并添加了这样的过滤器。问题的关键是“仅从很长的字符串中提取正确的IP地址因此,它应该是关于好问题的好答案库,而不仅仅是解决当前老年退休金问题的解决方案。即使你帮助过OP,他可能会满意,但其他读者可能不会满意。如果你考虑到这一点,我会投赞成票。@R2RT我相信现在的解决方案可以做到这一点。它不必完全由正则表达式完成——这不是要求。C++语言是上下文敏感的,但它依赖于上下文无关语法,依赖于语义处理(例如符号表的使用)来确定输入的程序是否有效。
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)
['90.123.1.100', '99.99.99.100', '13.18.19.100', '1.2.3.4']