使用IPv4地址范围(例如169.254.0.0/16或192.168.0.0/16),可以轻松地为每一个构造一个正则表达式,因为一旦您精确匹配前6位数字,就可以完成。
但是,如何匹配保留范围较小的任何地址,例如
100.64.0.0 –
100.127.255.255
以100\.开头的正则表达式不能满足要求,因为在100.64和100.127范围之外的数字(例如100.65.0.0、100.127.255.256)将被错误地匹配。 如何最好地捕获这样的范围,而不必明确定义每个范围内的每个有效子范围? 语言是Python。
作为参考,可以在此处找到保留IP地址和范围的完整列表。
欺骗? stackoverflow.com/questions/106179/
为什么不使用IP地址库? docs.python.org/3/library/ipaddress.html或pypi.python.org/pypi/py2-ipaddress
@TessellatingHeckler,因为ipaddress.ip_address只会告诉我一个地址有效。它不能帮助我检测保留的IP地址。
@AvinashRaj不,不是骗子。我已经有一个匹配所有IP地址的正则表达式。我们需要仅匹配子集的正则表达式。
@Pyderman是的。 try: addr = IPv4Address(text); except ValueError: print("not a valid IP address") if addr in IPv4Network(100.64.0.010): print("thats a reserved address")
@TessellatingHeckler 100.64.0.0/10是地址块。一个实际的例子是10.64.1.1,在这种情况下ipaddress.IPv4Address()只是告诉我它是有效的。
@Pyderman您错过了Python容器类型的奇迹。"网络中的地址"。尝试IPv4Address(100.64.1.1) in IPv4Network(100.64.0.010),它会说是True。尝试IPv4Address(100.63.1.1) in IPv4Network(100.64.0.010)及其错误
ip地址前后必须有空格对吗?
@TessellatingHeckler嗯,好的。我不知道ipaddress模块??知道这些保留范围。那么它足够安全了,然后可以将该Wiki页面上的所有范围(地址块)放入列表中,然后对于找到的任何给定IP地址,测试是否在IPv4Network(blocks [i])中使用IPv4Address(theIP),依此类推?
@Pyderman是的,我是这样认为的。
@TessellatingHeckler谢谢。在解释器中运行良好,但是当我将其放入函数中时,会遇到此问题:stackoverflow.com/questions/30996380/
首选使用IPv4解析库。 如果您坚持使用正则表达式,
re.search('^(100\.(6[4-9]|[7-9]\d|1[0-1]\d|12[0-7])(\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])){2})$', text)
您可以看到我正在分别搜索:
64-69(6[4-9])
70-99([7-9]\d)
100-119(1[0-1]\d)
120-127(12[0-7])
和
0-9(\d)
10-99([1-9]\d)
100-199(1\d\d)
200-249(2[0-4]\d)
250-255(25[0-5])
这是一种方法:
import re
print re.findall(r'\d+\.\S+\d', 'fdgsdfg 100.127.255.255 ggffgsdf 100.64.0.0 asdffsdf')
输出:
['100.127.255.255', '100.64.0.0']
如果100.127.255.255是否在100.64.0.0/10子网中,则无法回答。
你什么意思?
@TessellatingHeckler是什么意思?
我的意思是,问题不是要从文本行中提取IP地址,这就是您正在做的事情。 问题是询问比较一个IP地址是否在两个IP地址之间。 它是"从文本行中拉出数字"与"查看数字是否在5到15之间"之间的区别。 IP地址和网络具有树形结构。 10.0.5.024在10.0.0.016中,并且也在8.0.0.06中,并且在10.0.4.0-10.0.8.254范围内。 问题就是要进行的这种测试-与IP的工作方式相适应。