我正在尝试创建一个Python脚本,它将过滤并从traceroute输入中选择相关的IP地址。。。你知道吗
这是输入:
Hostname#traceroute 10.0.0.1
Type escape sequence to abort.
Tracing the route to 10.0.0.1
1 10.0.0.2 0 msec 6 msec 0 msec
11 10.0.0.3 115 msec
10.0.0.4 115 msec 116 msec
我正在创建一个列表:
hosts = ['Hostname#traceroute 10.0.0.1', 'Type escape sequence to abort.', 'Tracing the route to 10.0.0.1', ' 1 10.0.0.2 0 msec 6 msec 0 msec', '11 10.0.0.3 115 msec', ' 10.0.0.4 115 msec 116 msec']
现在,我的目标是过滤掉我不需要的元素,基本上只保留最后3行:
pattern = re.compile(r"(?<=\s\s\s|\s\d\s|\s\d\d)\d+\.\d+\.\d+\.\d+")
ip = list(filter(pattern.match, hosts))
我已经在联机生成器中测试了regex本身,所以应该可以,但是在Python中我得到了一个空列表,这表明没有匹配项。你知道吗
我花了好几个小时找出问题所在,但没能找到。这不是一个空列表,就是一个类似这样的错误,即使我把它转换成了字符串:
return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object
这里有两个小问题
首先,在您的正则表达式中,在look behind alternation中,这个
|\s\d\d)
是不正确的,因为行是“11”,因此您的正则表达式应该是|\d\d\s)
第二个问题是,您使用的是match而不是findall。Match用于匹配整行,但是regex不能匹配整行,所以在这个
filter(pattern.findall, hosts)
中使用findall解决了这个问题。你知道吗如果您希望您的代码使用match而不是findall,请尝试使用这个regex
.*\d+\.\d+\.\d+\.\d+\s.*
,它将只匹配最后三行,并给出您想要的结果。你知道吗运行你的临时代码,看看它是如何输出你想要的结果的
按你的预期打印最后三行
另外,如果您只想打印最后三行,您可以利用这样一个事实,即在最后三行中,IP后面跟一个空格,因此您也可以使用这样的简化regex
pattern = re.compile(r"\d+\.\d+\.\d+\.\d+\s")
,它也会给您最后三行。你知道吗编辑:在IP之后有空格的regex代码
这些指纹
相关问题 更多 >
编程相关推荐