python中reg表达式值的匹配与添加

2024-10-01 04:55:37 发布

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

我有一个包含到服务器的跟踪路由的文件。我想提取最后一个路由器接触和编译平均延迟。你知道吗

我尝试了以下操作,但它只显示单个延迟值。如何添加延迟并获得延迟的平均值?。你知道吗

文件包含跟踪:

traceroute to 34.233.68.171 (34.233.68.171), 30 hops max, 60 byte packets
 1  192.168.1.1 (192.168.1.1)  1.458 ms  1.319 ms  1.236 ms
 2  173.230.125.21 (173.230.125.21)  9.911 ms  9.308 ms  9.702 ms
 3  99.82.176.202 (99.82.176.202)  9.616 ms  10.239 ms  10.095 ms
 4  54.239.104.28 (54.239.104.28)  31.762 ms  31.663 ms 54.239.104.88 (54.239.104.88)  32.679 ms
 5  54.239.104.23 (54.239.104.23)  28.090 ms 54.239.104.99 (54.239.104.99)  26.883 ms 54.239.104.63 (54.239.104.63)  30.373 ms
 6  * * *
 7  54.239.43.176 (54.239.43.176)  22.007 ms 54.240.229.173 (54.240.229.173)  27.092 ms 54.239.42.188 (54.239.42.188)  34.865 ms
 8  * * *
 9  * * *
10  * * *
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  * * *
18  52.93.28.172 (52.93.28.172)  22.837 ms 52.93.28.194 (52.93.28.194)  31.958 ms 52.93.28.154 (52.93.28.154)  27.522 ms
19  * * *
20  * * *
21  * * *
22  * * *
23  * * *
24  * * *
25  * * *
36  * * *

我的代码:

import re

rgexpress = re.compile(r'\s\s\d\d?.\d\d\d+\s+ms') 
with open("new2") as f:
    for line in f:
        result = rgexpress.search(line)
        print(result)

我的结果是:

None
<re.Match object; span=(28, 38), match='  1.458 ms'>
<re.Match object; span=(35, 45), match='  9.911 ms'>
<re.Match object; span=(33, 43), match='  9.616 ms'>
<re.Match object; span=(33, 44), match='  31.762 ms'>
<re.Match object; span=(33, 44), match='  28.090 ms'>
None
<re.Match object; span=(33, 44), match='  22.007 ms'>
None
None
None
None
None
None
None
None
None
None
<re.Match object; span=(31, 42), match='  22.837 ms'>
None
None
None
None
None
None
None
None

期望结果: ''' (22.837+31.958+27.522)/3 = 27.439‬ ''' 平均值=27.439∗


Tags: 文件re服务器none路由objectmatchline
2条回答
import re

rgexpress = re.compile(r'\s\s\d\d?.\d\d\d+\s+ms') 
sum = 0
count = 0
with open("new2") as f:
    for line in f:
        result = rgexpress.search(line)
        if result:
            sum += float(result.group(0))
            count += 1
print(sum/count)

我希望编辑的版本更好。你知道吗

使用re.findall查找一行上所有匹配的延迟,将它们转换为float并计算平均值:

import re

# some sample data
data = [
"7  54.239.43.176 (54.239.43.176)  22.007 ms 54.240.229.173 (54.240.229.173)  27.092 ms 54.239.42.188 (54.239.42.188)  34.865 ms",
"8  * * *"
]

re_delay = re.compile(r'\d+\.\d{3}(?= ms)')
for line in data:
    delays = [float(delay) for delay in re_delay.findall(line)]
    if delays:
        mean = sum(delays)/len(delays)
        print(mean)

# 27.988

注意,应该使用\d+,就像我在这里做的那样,而不是\d\d作为延迟的整数部分,否则任何大于100ms的延迟都不会匹配。你知道吗


编辑以回答评论中的问题:

您还可以建立一个方法列表:

re_delay = re.compile(r'\d+\.\d{3}(?= ms)')
out = []
for line in data:
    delays = [float(delay) for delay in re_delay.findall(line)]
    if delays:
        mean = sum(delays)/len(delays)
        out.append(mean)

并使用

print(out[-1])

相关问题 更多 >