[英]Python - Add matched square bracket with numbers regular expression to 2d Array
我正在尝试编写一些python通过文本日志进行解析。 日志中大多数行上都有一个时间戳,如果日志中包含某些文本,我想捕获2d数组中的时间戳,以便以后可以将值与2d数组中的值进行比较。
日志文件示例如下所示:
[1542053213 s] Starting Program TEE:
-----------------------------------------
[1542053213 s] PROGRAM ERROR
ERRHAND: 1033
ERRHAND: 233545
ERRHAND: 1
[1542053213 s] Program completed!
[1542053300 s] Ending Program. Stopping!
[1542053500 s] Starting Program FOO:
-----------------------------------------
[1542060100 s] Program completed!
[1542060105 s] Ending Program. Stopping!
我的代码当前能够正确检测起止行:
from os.path import expanduser
import re
#Setting variables
filepath = expanduser('~/LogAutomation/programlog.txt')
timeArray = []
tempStart = ''
tempEnd = ''
with open(filepath) as myFile:
line = myFile.readline()
cnt = 1
while line:
if ("Starting Program") in line:
print("MATCH FOUND FOR STARTING PROGRAM")
print("Line {}: {}".format(cnt, line.strip()))
#Add timestamp to time array
#tempStart = matched regular expression
elif ("Ending Program. Stopping!") in line:
print("MATCH FOUND FOR ENDING PROGRAM")
print("Line {}: {}".format(cnt, line.strip()))
#Add timestamp to time array
#tempEnd = matched regular expression
#Add [tempStart, tempEnd] to timeArray
line = myFile.readline()
cnt +=1
myFile.close()
print("Completed Script")
但是,我试图添加注释的功能。 我不确定从哪里开始。 我尝试使用https://pythex.org/创建正则表达式,并尝试编辑以下内容以从[digits(space)s]序列中提取数字序列: (\\[[,\\d]*)
但与上面的日志中的示例时间戳不匹配。 它目前包括我不想要的开始括号。
非常感谢您提供有关确定如何提取数字以及将项目添加到2d数组的任何帮助。
注意:我是一名全新的Python开发人员,所以如果这是一个简单的问题,请原谅。 我正在努力学习。
编辑---这是使用以下建议的更新代码库:
from os.path import expanduser
import re
#Setting variables
filepath = expanduser('~/LogAutomation/programlog.txt')
timeArray = []
tempStart = ''
tempEnd = ''
# with open(filepath) as myFile:
# line = myFile.readline()
# cnt = 1
# while line:
# if ("Starting Program") in line:
# print("MATCH FOUND FOR STARTING PROGRAM")
# print("Line {}: {}".format(cnt, line.strip()))
# #Add timestamp to time array
# #tempStart = matched regular expression
#
# elif ("Ending Program. Stopping!") in line:
# print("MATCH FOUND FOR ENDING PROGRAM")
# print("Line {}: {}".format(cnt, line.strip()))
# #Add timestamp to time array
# #tempEnd = matched regular expression
#
# #Add [tempStart, tempEnd] to timeArray
#
# line = myFile.readline()
# cnt +=1
#
# myFile.close()
import re
with open(filepath) as myFile:
all_logs = myFile.read()
starting_regex = re.compile(r'\[(\d+)\s+s\]\s+Starting\s+Program')
ending_regex = re.compile(r'\[(\d+)\s+s\]\s+Ending\s+Program\.\s+Stopping')
start_times = list(map(int, starting_regex.findall(all_logs)))
end_times = list(map(int, ending_regex.findall(all_logs)))
timeArray = list(map(list, zip(start_times, end_times)))
for x in timeArray:
print(x)
print(timeArray[x])
print("Completed Script")
要仅捕获数字,只需在括号之间放入与数字匹配的字符,如下所示: (\\d+)
为了使开头的方括号与空格匹配( \\s
表示空格字符): \\[(\\d+)\\s
如果你想更加具体由专职戳匹配,直到右方括号(同时仍只捕捉位): \\[(\\d+) s\\]
其中间的空间)
括号和s
是显著。
完整的正则表达式(假设使用.match()
)可以是:
regex = "\[(\d+)\s"
tempStart = re.match(regex, line).group(1)
要将值放在2d数组中,您就对了, [tempStart, tempEnd]
基本形成一行。 要将其添加到timeArray
,我们可以使用:
timeArray.append([tempStart, tempEnd])
首先,为启动程序创建一个正则表达式:
\[(\d+)\s+s\]\s+Starting\s+Program
这只是一个简单的正则表达式,它将匹配[1542053213 s] Starting Program
类的字符串。
但是,如果您注意到了,我用\\d+
(数字部分)添加了一对括号,加上括号使它成为正则表达式中的一个组,这是我们在此正则表达式中唯一的组。
同样,我将为Ending Program创建一个正则表达式,将数字分组。
\[(\d+)\s+s\]\s+Ending\s+Program\.\s+Stopping
现在,让我们在python程序中使用它们,然后选择组:
import re
with open(filepath) as myFile:
all_logs = myFile.read()
starting_regex = re.compile(r'\[(\d+)\s+s\]\s+Starting\s+Program')
ending_regex = re.compile(r'\[(\d+)\s+s\]\s+Ending\s+Program\.\s+Stopping')
start_times = list(map(int, starting_regex.findall(all_logs)))
end_times = list(map(int, ending_regex.findall(all_logs)))
timeArray = list(map(list, zip(start_times, end_times)))
在上面的程序中,我一次读取了所有日志文件,并使用findall
方法查找了正则表达式将匹配的all_logs
中的所有匹配项。
现在,有趣的部分是: findall
仅返回与组匹配的值的列表,并且正则表达式中只有一个组,即(\\d+)
,因此start_times
和end_times
仅包含时间值。
start_times
和end_times
的相应值包含开始程序和结束程序的时间。
因此,要使每个列表成对,我们只需zip
两个列表。 它将创建每个对的tuple
,然后让我们使用map
方法将每个tuple
转换为list
,然后将map
对象转换为list
以创建列表列表。
timeArray
现在将是列表的列表。 每个子列表仅包含两个元素,第一个是程序的开始时间,第二个是结束时间。
编辑 :
您实际上不需要循环即可打印出timeArray
的值。 您可以使用print
语句查看值,它将打印整个列表:
print(timeArray)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.