python-3.6 - 从文本文件中搜索模式,如果模式丢失,则放置一个值 Null
问题描述
尊敬的同事,我有一个原始数据格式,如下详述,其中主要必须是三行,每一行都以模式dn:
跟随ftpuser
和开头description
,而在某些情况下,第三行description
丢失,因此在这种情况下,前两行是完整的. 现在,我正在使用多行正则表达式来匹配所有这些模式,并使用它从我的data
变量中获取数据,并将其传递给正则表达式(re.findall),此外,我有 for 循环matchObj
以获取值索引形式,所以我只能从new_str
列表中获得所需的索引。
以下是数据文件:
dn: uid=ac002,ou=ftpusers,ou=applications,o=regg.com
ftpuser: Y
description: file transfer|12/31/2010|file transfer
dn: uid=ab02,ou=ftpusers,ou=applications,o=regg.com
ftpuser: disabled_5Mar07
description: Remedy Tkt 01239399 regg move
dn: uid=mela,ou=ftpusers,ou=applications,o=regg.com
ftpuser: Y
description: ROYALS|none|customer account
dn: uid=aa01,ou=ftpusers,ou=applications,o=regg.com
ftpuser: T
dn: uid=aa02,ou=ftpusers,ou=applications,o=regg.com
ftpuser: Y
dn: uid=aa03,ou=ftpusers,ou=applications,o=regg.com
ftpuser: Y
dn: uid=bb01,ou=ftpusers,ou=applications,o=regg.com
ftpuser: T
dn: uid=bb02,ou=ftpusers,ou=applications,o=regg.com
ftpuser: Y
dn: uid=bb03,ou=ftpusers,ou=applications,o=regg.com
ftpuser: Y
dn: uid=bb05,ou=ftpusers,ou=applications,o=regg.com
ftpuser: Y
dn: uid=ab01,ou=ftpusers,ou=applications,o=regg.com
ftpuser: Y
description:: VGVzdGluZyA=
dn: uid=tt@regg.com,ou=ftpusers,ou=applications,o=regg.com
ftpuser: T
description: REG-JP|7-31-05|REG-JP
下面是我尝试过的代码,但这里的问题是,这个代码只选择它获取所有三行(dn:
、、ftpuser
)的数据description
和只有两行的行((dn:
、ftpuser
)它无法检索那些因此我想知道,我们如何才能让这些行也进入类似的输出制作/附加Description: null
到它缺失的地方
#!/usr/bin/python3
# ./dataparse.py
from __future__ import print_function
from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE,SIG_DFL)
import re
with open('test2', 'r') as f:
for line in f:
line = line.strip()
data = f.read()
regex = (r"dn:(.*?)\nftpuser: (.*)\ndescription:* (.*)")
matchObj = re.findall(regex, data)
for index in matchObj:
#print(index)
index_str = ' '.join(index)
new_str = re.sub(r'[=,]', ' ', index_str)
new_str = new_str.split()
print("{0:<30}{1:<20}{2:<50}".format(new_str[1],new_str[8],new_str[9]))
结果输出:
$ ./dataparse.py
ab02 disabled_5Mar07 Remedy
mela Y ROYALS|none|customer
ab01 Y VGVzdGluZyA
tt@regg.com T REG-JP|7-31-05|REG-JP
作为 python 初学者,我将不胜感激任何帮助或建议。
解决方案
只需在您的正则表达式模式中使描述可选。将其更改为:
r"dn:(.*?)\nftpuser: (.*)\n(?:description:* (.*))?"
推荐阅读
- c# - 初始化静态类的属性失败,出现空值异常
- latex - 与它定义的命令相比,如何解释乳胶中 \newcommand 的语法
- django - How to manage change Emailid and Change Password for user logged in using Social Media in Django all-auth?
- python - 如何在 scikit learn 中为新分类器测试看不见的句子
- odoo - Employee can see there own info only odoo
- java - 递归查找并返回数组中的最小值和最大值
- python - 如何找到单个 x 和 y 值的拟合参数
- ios - 如何使用 nativeScript 制作聊天应用程序?
- javascript - 如何在 carousal 中设置过渡效果(react)
- python-3.x - 为什么在 Python 的这个递归函数中,即使满足基本条件,执行也会继续?