Python-将带有数字正则表达式的匹配方括号添加到2d数组
我正试图编写一些python来通过文本日志进行解析。日志中的大多数行上都有时间戳,如果日志包含某些文本,我希望捕获二维数组中的时间戳,以便以后可以将值与二维数组中的值进行比较 示例日志文件如下所示:Python-将带有数字正则表达式的匹配方括号添加到2d数组,python,regex,multidimensional-array,Python,Regex,Multidimensional Array,我正试图编写一些python来通过文本日志进行解析。日志中的大多数行上都有时间戳,如果日志包含某些文本,我希望捕获二维数组中的时间戳,以便以后可以将值与二维数组中的值进行比较 示例日志文件如下所示: [1542053213 s] Starting Program TEE: ----------------------------------------- [1542053213 s] PROGRAM ERROR ERRHAND: 1033 ERRHAND: 233545 ERRHAND: 1 [
[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")
但是,我正在尝试添加已注释的功能。我不知道从哪里开始这样做。我尝试使用创建正则表达式,并尝试编辑以下内容,以便从[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.append([tempStart, tempEnd])
要仅捕获数字,只需将与数字匹配的字符放在括号之间,如:(\d+)
要匹配开头的全方括号,请使用空格(\s
表示空白字符):\[(\d+)\s
如果您想通过将完整时间戳匹配到结束方括号来更加具体(同时仍然只捕获数字):\[(\d+)s\]
,其中)
括号和s
之间的空间非常大
完整的正则表达式(假设使用.match()
)可以是:
regex = "\[(\d+)\s"
tempStart = re.match(regex, line).group(1)
要将值放入2d数组中,您可以使用[tempStart,tempEnd]
基本上形成一行。要将其添加到时间数组中,我们可以使用:
timeArray.append([tempStart, tempEnd])
让我们首先创建一个用于启动程序的正则表达式:
\[(\d+)\s+s\]\s+Starting\s+Program
这只是一个简单的正则表达式,它将匹配字符串,如[1542053213 s]启动程序
但是如果你注意到的话,我已经添加了一对括号,带有\d+
(数字部分),添加括号使它成为正则表达式中的一个组,这是我们在正则表达式中唯一的一个组
类似地,我将创建一个用于结束程序的正则表达式,使数字成为一个组:
\[(\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
方法查找正则表达式将匹配的所有日志中的所有事件
现在,有趣的部分是:findall
只返回与组匹配的值列表,并且正则表达式中只有一个组,即(\d+)
,因此,start\u times
和end\u times
将只包含时间值
start_times
和end_times
的对应值包含启动程序和结束程序的时间
因此,要为每个列表创建一对,让我们使用map
方法将zip
两个列表。它将创建每个列表对的tuple
s,并使用map
方法将每个tuple
转换为list
列表,然后将map
对象转换为list
以创建列表列表
timeArray
现在将是一个列表。每个子列表只包含两个元素,第一个是程序的开始时间,第二个是结束时间
编辑:
实际上,打印timeArray
的值并不需要循环。您可以使用print
语句查看值,它将打印整个列表:
print(timeArray)
让我们首先创建一个用于启动程序的正则表达式:
\[(\d+)\s+s\]\s+Starting\s+Program
这只是一个简单的正则表达式,它将匹配字符串,如[1542053213 s]启动程序
但是如果你注意到的话,我已经添加了一对括号,带有\d+
(数字部分),添加括号使它成为正则表达式中的一个组,这是我们在正则表达式中唯一的一个组
类似地,我将创建一个用于结束程序的正则表达式,使数字成为一个组:
\[(\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
方法查找正则表达式将匹配的所有日志中的所有事件
现在,有趣的部分是:findall
只返回与组匹配的值列表,并且正则表达式中只有一个组,即(\d+)
,因此,start\u times
和end\u times
将只包含时间值
start_times
和end_times
的对应值包含启动程序和结束程序的时间
因此,要为每个列表创建一对,让我们只需zip
两个列表。它将为每个列表创建tuple
s,然后让我们转换每个s