繁体   English   中英

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

Python - Add matched square bracket with numbers regular expression to 2d Array

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试编写一些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")
2 个回复

要仅捕获数字,只需在括号之间放入与数字匹配的字符,如下所示: (\\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)
2 python正则表达式匹配可选方括号

我有以下字符串: 我试图找到一个匹配所有这些的正则表达式。 我不知道如何在字符串末尾的日期周围匹配可选的方括号,例如[2014年5月16日]。 最后的日期正则表达式只匹配方括号中的日期而不是没有的日期。 感谢所有回答的人。 @Matt Clarkson我想要匹配的是一个 ...

3 Python正则表达式匹配方括号内的数字列表

因此,我试图做一个从文本返回所有引用(CITS)的函数,有时此文本是一个列表,这就是为什么我首先对其进行验证的原因。 文本将是这样的(文本是我从Wikipedia复制/粘贴的东西,这就是为什么它没有任何意义): 括号是一个高标点符号,通常用于文本内的匹配对中| CITS:[12 ...

4 正则表达式匹配python中方括号中的数字

我需要匹配并返回方括号中包含的数字的字符串索引。 示例字符串: Gabrilovich和Markovitch [11,12]提出了一种使用条件随机场[6]作为训练过程的方法..... 在这里,我想使用正则表达式在上述情况下提取任何给定数字的索引,如11,12或6。 我在尝试 ...

5 正则表达式仅匹配逗号而不是括号或方括号

我想用括号或方括号中的逗号分隔字符串 我正在使用以下字符串 土豆,植物油(向日葵油,玉米油和/或低芥酸菜籽油),蜂蜜烧烤调料[糖,盐,右旋糖,玉米粉酵母,洋葱粉,香料],麦芽糖糊精果糖,酵母提取物,糖蜜,天然香料(包括牛奶),玉米淀粉,蜂蜜,阿拉伯胶,辣椒粉提取物,焦糖色,大蒜粉 ...

6 正则表达式匹配方括号内的括号内的数字和可选文本

首先,我在C#这里,这就是我正在处理的RegEx的味道。 以下是我需要能够匹配的东西: 要么 所以基本上我需要知道括号之间的数字是否为数字,并忽略右括号和闭方括号之间的所有内容。 任何RegEx大师都在关心帮忙吗? ...

2009-06-17 21:35:12 7 10174   c#/ regex
8 正则表达式模式来抓住方括号之间的所有数字?

我正在尝试创建一个正则表达式模式,以捕获给定字符串中方括号之间并用逗号分隔的所有数字。 输出应该像这样, 数1 = 45 2号= 66 依此类推...到目前为止,我所拥有的只是一种模式,贪婪地抓住方括号之间的所有内容。 我是否应该只创建两个模式,一个是贪心模式 ...

2016-01-06 23:09:15 1 936   c#/ regex
暂无
暂无

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

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