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(假设它们都与示例中的一样):