代码之家  ›  专栏  ›  技术社区  ›  Karn Kumar

从文本文件中搜索模式,如果缺少模式,则放置一个空值

  •  0
  • Karn Kumar  · 技术社区  · 6 年前

    尊敬的同事们,我有一个原始的数据格式,如下所述,主要是三行,每行以模式开始 dn: 下列的 ftpuser description ,而在某些情况下 描述 缺少,因此在本例中保留了前两行。现在,我使用一个多行regex来匹配所有这些模式,并使用它从 data 变量,这被传递给regex(re.findall),而且,我已经为 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
    

    下面是我试过的代码,但这里的问题是,这段代码只选择它得到所有三行的数据( 域名: 我是说, 弗普瑟 我是说, 描述 )只有两条线的线(( 域名: 我是说, 弗普瑟 )它无法检索到这些,因此我想知道,我们如何将这些行也放入类似的输出making/appending中 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初学者,我希望得到任何帮助或建议。

    1 回复  |  直到 6 年前
        1
  •  1
  •   blhsing    6 年前

    只需在regex模式中选择description。更改为:

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