我们有一个很大的日志文件,其中包含以下两行:
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).
用?
标记的字符可以是任何数字。
我们想要存储像这样的变量:
var virtual_cur
中的
640733184
var virtual_max
中的1082470400
var actual_cur
中的472154112
var actual_max
中的861736960
用Python 3.6
编写了一个代码片段,但它打印的是空列表:
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个模式,如果匹配任何特定模式,则选择值并将其放入相应的变量中。
不确定第二个模式的通配符是否匹配。
请给我们一个有效的方法来做这件事。
发布于 2018-08-30 04:13:47
使用正则表达式
(?:(?:Cycles Run:[ \t]+)|(?:Current>[ \t]+))(\d+)
你可以按照下面的思路做一些事情:
import re
pat=re.compile(r'(?:(?:Cycles Run:[ \t]+)|(?:Current>[ \t]+))(\d+)')
with open('test.txt','r') as f:
for line_num, line in enumerate(f):
m=pat.search(line)
if m:
print(line_num, m.group(0))
发布于 2018-08-30 03:57:21
你可以在这里使用一个带有两个lookbehinds的替换:
(?<=Cycles Run: )\d+|(?<= Current> )\d+
正则表达式演示here。
Python示例:
import re
text = '''
00 LOG | Cycles Run: 120001
00 LOG ! Virtual: Max> 1082470400 bytes (1.0081 gb), Current> 640733184 bytes (0.5967 gb)
'''
pattern = re.compile(r'(?<=Cycles Run: )\d+|(?<= Current> )\d+')
matches = re.findall(pattern,text)
num_cycle = matches[0]
current = matches[1]
print(num_cycle,current)
打印:
120001 640733184
由于您在循环中重复该过程,因此建议在循环之前只使用re.compile
编译一次模式。
发布于 2018-08-30 04:01:48
这里我们搜索一些标识符(比如cycles
并应用不同的正则表达式)
import re
with open('test.txt','r') as f:
for line in f:
if re.search(r'Cycles',line):
m=re.findall(r'\d+$',line)
else:
m=re.findall(r'Current> (\d+)',line)
print(m)
https://stackoverflow.com/questions/52084871
复制相似问题