我写了下面的代码从一个文本文件的一个特定行中提取两个值。我的文本文件有多行信息,我试图找到下面的行
2022-05-03 11:15:09.395 [6489266] | (rtcp_receiver.cc:823): BwMgr Received a TMMBR with bps: 1751856
我正在从上面的行提取时间(11:15:09)和带宽(1751856
import re
import matplotlib.pyplot as plt
import sys
time =[]
bandwidth = []
myfile = open(sys.argv[1])
for line in myfile:
line = line.rstrip()
if re.findall('TMMBR with bps:',line):
time.append(line[12:19])
bandwidth.append(line[-7:])
plt.plot(time,bandwidth)
plt.xlabel('time')
plt.ylabel('bandwidth')
plt.title('TMMBR against time')
plt.legend()
plt.show()
这里的问题是我给出了绝对索引值(第[12:19]行)来提取数据,如果这行有一些额外的字符或任何额外的空格,这些数据就不起作用了。我可以用什么正则表达式来提取这些值呢?我是RE的新手
4条答案
按热度按时间ztigrdn81#
试试这个:
(?:\d+:\d+:|(?<=TMMBR with bps: ))
非捕获基团。\d+:
一个或多个数字,后跟冒号:
。\d+:
一个或多个数字,后跟冒号:
。|
或(?<=TMMBR with bps: )
是前面有句子TMMBR with bps:
的位置。\d+
一个或多个数字。参见regex demo
tct7dpnv2#
您可以对2个捕获组使用更具体一点的方法:
(\d\d:\d\d:\d\d)
捕获组1,匹配类似格式的时间\.\d{3}\b
匹配一个点和3个数字.*
匹配行的其余部分\bTMMBR with bps:\s*
字边界,匹配TMMBR with bps:
和可选空白字符(\d+)
捕获组2,匹配1个或多个数字\b
字边界请参见regex101 demo和Python demo。
示例
产出
nfg76nw03#
您可以只使用拆分:
u91tlkcl4#
re.findall
来检查字符串中模式的出现;效率不高。对于正则表达式情况,请改用re.search
在您的情况下,拆分一条生产线并获得所需的部件就足够了: