首页 > 解决方案 > 在 Python 中使用正则表达式遍历文件内容并提取字段

问题描述

我想遍历一个文件并使用正则表达式仅提取特定数字并将这些数字存储在一个名为event_id. 然后我想将数字与字典键进行比较,如果事件中有匹配项,程序将打印Matched ID: 1102. 我走到这一步了。

但是我正在尝试提取该事件​​发生时的事件日期时间并将其存储在电梯中。所以屏幕打印输出应该是这样的:

Matched ID: 1102
Date and time of event: 2019-08-27 17:16:28.543879

Matched ID: 4611
Date and time of event: 2019-08-27 12:14:08.573156

我从中提取的文件数据如下所示:

<EventID Qualifiers="">1102</EventID>
<TimeCreated SystemTime="2019-08-27 17:16:28.543879"></TimeCreated>

<EventID Qualifiers="">4611</EventID>
<TimeCreated SystemTime="2019-08-27 17:16:28.543879"></TimeCreated>

这是我的代码:

evtxlogs = '/home/user/evtx_logs/'

event_id_regex = r'\W(\d*)\W/EventID\W'  
event_date_regex = r'(\d.*.\d*)\D\W\W\W.imeCreated>'

event_id = []  
event_date = []

eventdict = {'1102':{'count':0},'4611':{'count':0},'4624':{'count':0}}

for dirpath, dirnames, filenames in os.walk(evtxlogs): 

    for xml_file in filenames: 
        if xml_file.lower().endswith('.xml'): 
         
            with open(os.path.join(dirpath,xml_file), 'r') as f:
                data = f.read()
                event_id = re.findall(event_id_regex, data) 
                event_date = re.findall(event_date_regex, data) 
            
                for event_id in event_id:

                    if event_id in eventdict: 
                        print(f"Matched ID: {event_id}")
                        print(f"Date and time of event: {event_date}")

标签: python-3.xregex

解决方案


如果您有一个 XML 文件,那么最好按照预期使用它来获取您所需要的信息,因为处理可能会更快并且代码更健壮。有关使用 python 解析 XML 的简单演示,请参阅此答案

但是,单独回答提供的信息;假设您所追求的两个元素彼此相邻,您可以简单地扩展您的模式以TimeCreated使用组来捕获和提取您的值,如下所示:

import re

regex = r"^<EventID Qualifiers=\"\">(\d+)</EventID>$.^<TimeCreated SystemTime=\"(.+?)\""

test_str = ("<EventID Qualifiers=\"\">1102</EventID>\n"
    "<TimeCreated SystemTime=\"2019-08-27 17:16:28.543879\"></TimeCreated>\n\n"
    "<EventID Qualifiers=\"\">4611</EventID>\n"
    "<TimeCreated SystemTime=\"2019-08-27 17:16:28.543879\"></TimeCreated>")

matches = re.finditer(regex, test_str, re.MULTILINE | re.DOTALL)

for matchNum, match in enumerate(matches, start=1):
    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1
        group = match.group(groupNum)
        print (f"Group {groupNum}: {group}")

输出:

Group 1: 1102
Group 2: 2019-08-27 17:16:28.543879
Group 1: 4611
Group 2: 2019-08-27 17:16:28.543879

推荐阅读