Поиск шаблонов из текстового файла и, если шаблон отсутствует, введите значение Null - PullRequest
0 голосов
/ 29 июня 2018

Уважаемые коллеги, у меня есть формат необработанных данных, который подробно описан ниже, где в первую очередь он должен состоять из трех строк, и каждая строка начинается с шаблона dn:, следующего за ftpuser и description, тогда как в некоторых ситуациях третья строка description отсутствует, следовательно, в этом случае используются первые две строки. Теперь я использую многострочное регулярное выражение, чтобы сопоставить все эти шаблоны, и использую его для получения данных из моей переменной data, и это передается регулярному выражению (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

Ниже приведен код, который я пробовал, но проблема здесь в том, что этот код выбирает только те данные, в которых он получает все три строки (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

Как начинающий питон, буду признателен за любую помощь или предложение.

1 Ответ

0 голосов
/ 29 июня 2018

Просто сделайте описание необязательным в вашем шаблоне регулярных выражений. Измените его на:

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