Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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 获取半结构化数据上的正则表达式匹配-dat文件_Python_Regex - Fatal编程技术网

Python 获取半结构化数据上的正则表达式匹配-dat文件

Python 获取半结构化数据上的正则表达式匹配-dat文件,python,regex,Python,Regex,我有一个dat文件,我需要获取其中用户的一些信息 文件如下所示: USER john STATE 'RJ' ID 123456 MAIL john@mail.com PRIVILEGES STATUS COMPUTER office docker cluster1 ACTIVE WINDOWS USER maria STATE 'SP' ID 987654 MAIL maria@mail.com PRIVILEGES

我有一个
dat文件
,我需要获取其中用户的一些信息

文件
如下所示:

USER john STATE 'RJ'
ID 123456 MAIL john@mail.com
PRIVILEGES                  STATUS  COMPUTER
    office docker cluster1  ACTIVE  WINDOWS  

USER maria STATE 'SP'
ID 987654 MAIL maria@mail.com
PRIVILEGES                   STATUS    COMPUTER
    financial-server office  INACTIVE  WINDOWS   

USER clarke STATE 'SP'
ID 55555 MAIL clarke@mail.com
PRIVILEGES                                          STATUS    COMPUTER
    active-directory gsuite cluster1 cluster2 admin ACTIVE    UBUNTU
我想做的是得到一个
列表
,它有一个
字典
,拥有用户及其特权,比如:

{'john': ['office', 'docker', 'cluster1'], 'maria': ['financial-server', 'office'], 'clarke': ['active-directory', 'gsuite', 'cluster1', 'cluster2', 'admin']}
名字很简单,我已经有了

with open("users.dat") as open_file:
    data = open_file.read()

x = re.findall("USER ([^\s]+)", data)

但是这些特权可以是一个或多个,我不知道如何获得,要保存在我的
字典中

你可以使用
\r |\n\s\s\s\s([a-z0-9\-]+\s)+
这样的模式来匹配任意数量的单词,包括数字或连字符,但只匹配小写。根据您提供的示例,假设这将起作用。它首先查找新行或返回字符,然后查找四个空格


因此,现在您只需将找到的每个组用空格分隔,然后将其分配给正确的人。

您可以使用类似
\r |\n\s\s\s([a-z0-9\-]+\s)+
的模式来匹配任意数量的单词,包括数字或连字符,但只匹配小写。根据您提供的示例,假设这将起作用。它首先查找新行或返回字符,然后查找四个空格


因此,现在您只需将找到的每个组在空格中拆分,然后将其分配给正确的人。

这不是最漂亮的代码,但它是有效的:

t = """
USER john STATE 'RJ'
ID 123456 MAIL john@mail.com
PRIVILEGES                  STATUS  COMPUTER
    office docker cluster1  ACTIVE  WINDOWS

USER maria STATE 'SP'
ID 987654 MAIL maria@mail.com
PRIVILEGES                   STATUS    COMPUTER
    financial-server office  INACTIVE  WINDOWS

USER clarke STATE 'SP'
ID 55555 MAIL clarke@mail.com
PRIVILEGES                                          STATUS    COMPUTER
    active-directory gsuite cluster1 cluster2 admin ACTIVE    UBUNTU
"""

import re

names = re.findall(r"USER\s([a-z]+)\sSTATE", t)
activities = re.findall(r"\s+([a-z1-9\s\-]+)\s+(INACTIVE|ACTIVE)", t)
results = {}
for user,rights in zip(names,activities):
    results[user] = re.findall(r"\w+", rights[0])

print(results)
基本上,由于应该列出每个用户及其权限,因此您可以单独获取这些权限。然后,您可以在找到活动之前获取他们的所有权利,然后在找到活动之后将其分离出来

输出:

{'john': ['office', 'docker', 'cluster1'], 'maria': ['financial', 'server', 'office'], 'clarke': ['active', 'directory', 'gsuite', 'cluster1', 'cluster2', 'admin']}

这不是最漂亮的代码,但它很有效:

t = """
USER john STATE 'RJ'
ID 123456 MAIL john@mail.com
PRIVILEGES                  STATUS  COMPUTER
    office docker cluster1  ACTIVE  WINDOWS

USER maria STATE 'SP'
ID 987654 MAIL maria@mail.com
PRIVILEGES                   STATUS    COMPUTER
    financial-server office  INACTIVE  WINDOWS

USER clarke STATE 'SP'
ID 55555 MAIL clarke@mail.com
PRIVILEGES                                          STATUS    COMPUTER
    active-directory gsuite cluster1 cluster2 admin ACTIVE    UBUNTU
"""

import re

names = re.findall(r"USER\s([a-z]+)\sSTATE", t)
activities = re.findall(r"\s+([a-z1-9\s\-]+)\s+(INACTIVE|ACTIVE)", t)
results = {}
for user,rights in zip(names,activities):
    results[user] = re.findall(r"\w+", rights[0])

print(results)
基本上,由于应该列出每个用户及其权限,因此您可以单独获取这些权限。然后,您可以在找到活动之前获取他们的所有权利,然后在找到活动之后将其分离出来

输出:

{'john': ['office', 'docker', 'cluster1'], 'maria': ['financial', 'server', 'office'], 'clarke': ['active', 'directory', 'gsuite', 'cluster1', 'cluster2', 'admin']}

您可以编写一个函数来处理文件的每个块,而不是依赖regex(假设它们都与示例中的一样):


您可以编写一个函数来处理文件的每个块,而不是依赖regex(假设它们都与示例中的一样):