繁体   English   中英

Python-将匹配的带有数字正则表达式的方括号添加到2d数组

[英]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_timesend_times仅包含时间值。

start_timesend_times的相应值包含开始程序和结束程序的时间。

因此,要使每个列表成对,我们只需zip两个列表。 它将创建每个对的tuple ,然后让我们使用map方法将每个tuple转换为list ,然后将map对象转换为list以创建列表列表。

timeArray现在将是列表的列表。 每个子列表仅包含两个元素,第一个是程序的开始时间,第二个是结束时间。

编辑

您实际上不需要循环即可打印出timeArray的值。 您可以使用print语句查看值,它将打印整个列表:

print(timeArray)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM