Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-将带有数字正则表达式的匹配方括号添加到2d数组_Python_Regex_Multidimensional Array - Fatal编程技术网

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

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 [

我正试图编写一些python来通过文本日志进行解析。日志中的大多数行上都有时间戳,如果日志包含某些文本,我希望捕获二维数组中的时间戳,以便以后可以将值与二维数组中的值进行比较

示例日志文件如下所示:

[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