首页 > 解决方案 > 从文本文件中搜索模式,如果模式丢失,则放置一个值 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 初学者,我将不胜感激任何帮助或建议。

标签: python-3.6

解决方案


只需在您的正则表达式模式中使描述可选。将其更改为:

r"dn:(.*?)\nftpuser: (.*)\n(?:description:* (.*))?"

推荐阅读