使用python从文本文件解析IP地址/网络

使用python从文本文件解析IP地址/网络,python,regex,ip,Python,Regex,Ip,我有下面的文本文件,我需要一些帮助来解析出IP地址 文本文件的格式如下 abc 10.1.1.1/32 aabbcc def 11.2.0.0/16 eeffgg efg 0.0.0.0/0 ddeeff 换句话说,一组IP网络作为日志文件的一部分存在。输出应如下所示: 10.1.1.1/32 11.2.0.0/16 0.0.0.0/0 我有下面的代码,但没有输出所需的信息 file = open(filename, 'r') for eachline in file.readl

我有下面的文本文件,我需要一些帮助来解析出IP地址

文本文件的格式如下

abc 10.1.1.1/32   aabbcc
def 11.2.0.0/16   eeffgg
efg 0.0.0.0/0   ddeeff
换句话说,一组IP网络作为日志文件的一部分存在。输出应如下所示:

10.1.1.1/32
11.2.0.0/16
0.0.0.0/0
我有下面的代码,但没有输出所需的信息

file = open(filename, 'r')
for eachline in file.readlines():
    ip_regex = re.findall(r'(?:\d{1,3}\.){3}\d{1,3}', eachline)
    print ip_regex

在这种特殊情况下,正则表达式可能过于复杂,您可以使用
split

with open(filename) as f:
    ipList = [line.split()[1] for line in f]

这应该会产生一个字符串列表,这些字符串是ip地址。

在这种特殊情况下,正则表达式可能会被过度使用,您可以使用
split

with open(filename) as f:
    ipList = [line.split()[1] for line in f]

这应该会产生一个字符串列表,这些字符串是ip地址。

首先,您的正则表达式除了四个虚线数字之外,甚至不会尝试捕获任何内容,因此它当然不会匹配任何其他内容,比如最后的
/32
。如果您只是在末尾添加,例如,
/\d{1,2}
,它将修复以下问题:

(?:\d{1,3}\.){3}\d{1,3}/\d{1,2}


然而,如果您对正则表达式的理解还不够透彻,那么您可能不应该将正则表达式作为一种“魔法”来使用,因为您永远无法调试或扩展正则表达式。使用
str
方法,如
split
find
,会有点冗长,但对于新手来说可能更容易理解:

for line in file:
    for part in line.split()
        try:
            address, network = part.split('/')
            a, b, c, d = address.split('.')
        except ValueError:
            pass # not in the right format
        else:
            # do something with part, or address and network, or whatever

作为旁注,根据您对这些东西的实际操作,您可能希望使用模块(或用于2.6-3.2)而不是字符串解析:

>>> import ipaddress
>>> s = '10.1.1.1/32'
>>> a = ipaddress.ip_network('10.1.1.1/32')
您可以将其与上述任何一项结合使用:

for line in file:
    for part in line.split():
        try:
            a = ipaddress.ip_network(part)
        except ValueError:
            pass # not the right format
        else:
            # do something with a and its nifty methods

首先,您的正则表达式除了四个虚线数字之外,甚至不尝试捕获任何东西,因此它当然不会匹配其他任何东西,比如末尾的
/32
。如果您只是在末尾添加,例如,
/\d{1,2}
,它将修复以下问题:

(?:\d{1,3}\.){3}\d{1,3}/\d{1,2}


然而,如果您对正则表达式的理解还不够透彻,那么您可能不应该将正则表达式作为一种“魔法”来使用,因为您永远无法调试或扩展正则表达式。使用
str
方法,如
split
find
,会有点冗长,但对于新手来说可能更容易理解:

for line in file:
    for part in line.split()
        try:
            address, network = part.split('/')
            a, b, c, d = address.split('.')
        except ValueError:
            pass # not in the right format
        else:
            # do something with part, or address and network, or whatever

作为旁注,根据您对这些东西的实际操作,您可能希望使用模块(或用于2.6-3.2)而不是字符串解析:

>>> import ipaddress
>>> s = '10.1.1.1/32'
>>> a = ipaddress.ip_network('10.1.1.1/32')
您可以将其与上述任何一项结合使用:

for line in file:
    for part in line.split():
        try:
            a = ipaddress.ip_network(part)
        except ValueError:
            pass # not the right format
        else:
            # do something with a and its nifty methods

试着描述每行代码的作用,你会发现错误。请参阅re文档。好的,您没有在正则表达式中包含任何内容来匹配结尾处的
/32
或类似内容,因此当然它只匹配
10.1.1.1
或类似内容。
re.findall(“\d+\.\d+\.\d+\.\d+\.\d+\.\d+\/\d+”,file.read())
,您还应该使用
打开文件作为旁注,没有理由在那里使用
readlines()<代码>文件
已经是一个可数行。你所做的只是浪费性地迫使Python在使用之前读取并解析内存中的整个文件。另一方面,这些不是IP地址,而是IP网络,其中包含一个地址和一个位掩码。事实上,您现有的代码已经在查找属于这些网络的IP地址…尝试描述每行代码的作用,您将发现错误。请参阅re文档。好的,您没有在正则表达式中包含任何内容来匹配结尾处的
/32
或类似内容,因此当然它只匹配
10.1.1.1
或类似内容。
re.findall(“\d+\.\d+\.\d+\.\d+\.\d+\.\d+\/\d+”,file.read())
,您还应该使用
打开文件作为旁注,没有理由在那里使用
readlines()<代码>文件
已经是一个可数行。你所做的只是浪费性地迫使Python在使用之前读取并解析内存中的整个文件。另一方面,这些不是IP地址,而是IP网络,其中包含一个地址和一个位掩码。事实上,您现有的代码已经找到了属于这些网络的IP地址…这个@abernert链接到的Debuggex网站是我见过的最好的regex网站。@TehTris:是的,我很喜欢它。但请注意,一旦他们退出测试版,他们显然将开始对非JS正则表达式收费。他们已经开始为转换为纯英语功能收费(然后他们禁用了该功能…)。非常聪明;我不确定我能不能回到……我以前用过的任何东西,我甚至都记不起来了@abernert链接到的这个Debuggex网站是我见过的最好的regex网站。@TehTris:是的,我很喜欢它。但请注意,一旦他们退出测试版,他们显然将开始对非JS正则表达式收费。他们已经开始为转换为纯英语功能收费(然后他们禁用了该功能…)。非常聪明;我不确定我能不能回到……我以前用过的任何东西,我甚至都记不起来了