使用正则表达式和python解析ping的结果
我有一个python脚本,它在ping提供的IPv4和IPv6地址列表时生成一个输出文件,如下所示:使用正则表达式和python解析ping的结果,python,regex,Python,Regex,我有一个python脚本,它在ping提供的IPv4和IPv6地址列表时生成一个输出文件,如下所示: Item Number: [item number] host = [hostname] PING [IPv4] 64 bytes from [dst.IP] icmp_seq=1 ttl=57 time=27.3 ms 64 bytes from [dst.IP] icmp_seq=2 ttl=57 time=26.8 ms 64 bytes from [dst.IP] icmp_seq
Item Number: [item number]
host = [hostname]
PING [IPv4]
64 bytes from [dst.IP] icmp_seq=1 ttl=57 time=27.3 ms
64 bytes from [dst.IP] icmp_seq=2 ttl=57 time=26.8 ms
64 bytes from [dst.IP] icmp_seq=3 ttl=57 time=21.6 ms
.
.
.
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 21.604/25.248/27.333/2.589 ms
PING [IPv6]
64 bytes from [dst.IP] icmp_seq=1 ttl=61 time=31.3 ms
64 bytes from [dst.IP] icmp_seq=2 ttl=61 time=22.0 ms
64 bytes from [dst.IP] icmp_seq=3 ttl=61 time=22.8 ms
.
.
.
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 22.098/25.480/31.866/4.519 ms
$$$$$
显然,括号内的信息是变量。我的目标是提取每个条目的每个IP版本的主机名、ttl和rtt最小值(位于“条目号”和“$$$$”之间),并将其导出到csv文件的一行
我无法找到合适的正则表达式来执行此操作。到目前为止,我所能做的只是提取一个条目号的所有信息,即上述标记之间的所有文本:
import re
reader = open('file')
text = reader.read()
match_list = re.findall(r'Item Number:\.(.*?)\${5}' ,text, re.S)
length = len(match_list)
for x in match_list:
print x
对于每个匹配项,此代码将省略“项目编号:”和“$$$$”
任何帮助都将不胜感激。我建议您首先将文件分为多个块,然后按如下方式处理每个块:
import csv
import re
from itertools import chain
with open('file') as f_input, open('output.csv', 'wb') as f_output:
text = f_input.read()
csv_output = csv.writer(f_output)
for block in re.findall(r'Item Number:(.*?)\${5}', text, re.S):
re_hostname = re.search(r'host = (.*)', block)
if re_hostname:
data = re.findall(r'ttl=(\d+) time=([0-9.]+) ', block)
csv_output.writerow([re_hostname.group(1)] + list(chain.from_iterable(data)))
[hostname],57,27.3,57,26.8,57,21.6,61,31.3,61,22.0,61,22.8
这将产生如下csv文件:
import csv
import re
from itertools import chain
with open('file') as f_input, open('output.csv', 'wb') as f_output:
text = f_input.read()
csv_output = csv.writer(f_output)
for block in re.findall(r'Item Number:(.*?)\${5}', text, re.S):
re_hostname = re.search(r'host = (.*)', block)
if re_hostname:
data = re.findall(r'ttl=(\d+) time=([0-9.]+) ', block)
csv_output.writerow([re_hostname.group(1)] + list(chain.from_iterable(data)))
[hostname],57,27.3,57,26.8,57,21.6,61,31.3,61,22.0,61,22.8
“到目前为止,我所能做的只是提取一个条目号的所有信息”。好的,这听起来是一个不错的起点。向我们展示您的代码,我们将从那里开始工作。谢谢Martin!我为我自己的应用程序改进了您的代码,如下所示:
data=re.findall(r'ttl=(\d+).*?rtt min\/avg\/max\/mdev=([0-9.]+)\/”,block,re.S)csv_output.writerow([re_hostname.group(1)]+列表(chain.from_iterable(data))
非常好,我不太确定您需要什么。如果您对答案满意,可以单击灰色勾号接受解决方案。