Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用正则表达式和python解析ping的结果_Python_Regex - Fatal编程技术网

使用正则表达式和python解析ping的结果

使用正则表达式和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

我有一个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=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))
非常好,我不太确定您需要什么。如果您对答案满意,可以单击灰色勾号接受解决方案。