【发布时间】:2018-08-29 19:33:23
【问题描述】:
我们有一个包含以下两行的大型日志文件:
00 LOG | Cycles Run: 120001
00 LOG ! Virtual: Max> ?????????? bytes (?.???? gb), Current> 640733184 bytes (?.???? gb).
00 LOG ! Virtual: Max> 1082470400 bytes (?.???? gb), Current> ????????? bytes (?.???? gb).
00 LOG ! Actual: Max> ????????? bytes (?.???? gb), Current> 472154112 bytes (?.???? gb).
00 LOG ! Actual: Max> 861736960 bytes (?.???? gb), Current> ????????? bytes (?.???? gb).
由于日志文件很大,我们希望逐行读取(而不是一次读取缓冲区中的整个文本),匹配特定的模式集并在单独的变量中选择值。
例如
00 LOG | Cycles Run: 120001
我们想要选择120001 并存储在一个变量中,比如cycle。
另一方面,我们解析这些行:
00 LOG ! Virtual: Max> ?????????? bytes (?.???? gb), Current> 640733184 bytes (?.???? gb).
00 LOG ! Virtual: Max> 1082470400 bytes (?.???? gb), Current> ????????? bytes (?.???? gb).
00 LOG ! Actual: Max> ????????? bytes (?.???? gb), Current> 472154112 bytes (?.???? gb).
00 LOG ! Actual: Max> 861736960 bytes (?.???? gb), Current> ????????? bytes (?.???? gb).
标有? 的字符可以是任何数字。
我们想存储如下变量:
640733184in varvirtual_cur
1082470400in varvirtual_max
472154112in varactual_cur
861736960in varactual_max
在Python 3.6 中写了一个 sn-p,但它打印的是空列表:
import re
filename = "test.txt"
with open(filename) as fp:
line = fp.readline()
while line:
cycle_num = re.findall(r'00 LOG | Cycles Run: (.*?)',line,re.DOTALL)
line = fp.readline()
print (cycle_num[0])
注意:我想选择单独变量中的每个值并使用它 稍后的。需要一个一个设置5个模式,匹配就取值 任何特定的模式,并将其放在无关变量中。
不确定第二个模式的通配符匹配。
请给我们建议一种有效的方法。
【问题讨论】:
-
你想要两个变量,每个值一个吗?
-
是的。对于第二个变量,我不确定如何使用带通配符的模式匹配来完成它。所以,没有把它包含在sn-p中。
-
请注意,
|是用于更改的正则表达式元字符。您的r'00 LOG | Cycles Run: (.*?)'示例正则表达式存在寻找00 LOG或`Cycles Run: (.*?)` 的问题,这就是它不匹配任何内容的原因。 -
既然
Max>和Current>在同一行中,您如何确定要捕获的目标是哪一个? -
我们需要搜索 4 种不同的模式。有两行带有
Virtual: Max>和Current,每行分别带有Virtual和Actual。我们需要做不同的模式匹配来选择提到的第一个和最后一个值。
标签: python regex python-3.6 readline findall