tracerou的Python3正则表达式编译

2024-04-24 19:10:32 发布

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

我正在尝试创建一个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

Tags: theto列表typeroutehostnamepatternsequence
1条回答
网友
1楼 · 发布于 2024-04-24 19:10:32

这里有两个小问题

首先,在您的正则表达式中,在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.*,它将只匹配最后三行,并给出您想要的结果。你知道吗

运行你的临时代码,看看它是如何输出你想要的结果的

import re

s = '''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 = re.findall(r'(.*)\n*',s)

pattern = re.compile(r"(?<=\s\s\s|\s\d\s|\d\d\s)\d+\.\d+\.\d+\.\d+")
ip = list(filter(pattern.findall, hosts))

print(ip)

按你的预期打印最后三行

[' 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']

另外,如果您只想打印最后三行,您可以利用这样一个事实,即在最后三行中,IP后面跟一个空格,因此您也可以使用这样的简化regex pattern = re.compile(r"\d+\.\d+\.\d+\.\d+\s"),它也会给您最后三行。你知道吗

编辑:在IP之后有空格的regex代码

import re

s = '''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 = re.findall(r'(.*)\n*',s)

pattern = re.compile(r"\d+\.\d+\.\d+\.\d+\s")
ip = list(filter(pattern.findall, hosts))

print(ip)

这些指纹

[' 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']

相关问题 更多 >