Как получить groupdict из многострочной строки с помощью регулярных выражений - PullRequest
0 голосов
/ 26 октября 2018

Я пытался получить словарь из многострочной строки с помощью регулярных выражений, но у меня проблема с правильным разделением строк.

Вот что я пробовал ...

import re

text = '''\n\n\nName: Clash1\nDistance: -1.274m\nImage Location: navis_raport_txt_files\\cd000001.jpg\nHardStatus: New\nClash Point: 1585.236m, 193.413m'''
clash_data = re.compile('''
    (?P<clash_number>Clash\d+)\n
    (?P<clash_depth>\d.\d{3})\n
    (?P<image_location>cd\d+.jpg)\n
    (?P<clash_status>\w{2:})\n
    (?P<clash_point>.*)\n
    (?P<clash_grid>\w+-\d+)\n
    (?P<clash_date>.*)''', re.I | re.VERBOSE)
print(clash_data.search(text).groupdict())

Этот похожий пример хорошо работает:

import re

MHP = ['''MHP-PW-K_SZ-117-R01-UZ-01 - drawing title 123''',
       'MHP-PW-K_SZ-127-R01WIP - drawing title 2',
       'MHP-PW-K_SZ-107-R03-UZ-1 - drawing title 3']

fields_from_name = re.compile('''
    (?P<object>\w{3})[-_]
    (?P<phase>\w{2})[-_]
    (?P<field>\w)[-_]
    (?P<type>\w{2})[-_]
    (?P<dr_number>\d{3})[-_]
    [-_]?
    (?P<revision>\w\d{2})?
    (?P<wip_status>WIP)?
    [-_]?
    (?P<suplement>UZ-\d+)?
    [\s-]+
    (?P<drawing_title>.*)
    ''', re.IGNORECASE | re.VERBOSE)
for name in MHP:
    print(fields_from_name.search(name).groupdict())

Почему моя попытка не работает так, как в примере?

1 Ответ

0 голосов
/ 26 октября 2018

Это не работает просто потому, что Pattern.search() не находит соответствия.Основываясь на рабочем примере, который вы имитируете, вам также необходимо сопоставить символы между именованными группами захвата, которые вы хотите использовать в выходном файле dict (чтобы весь шаблон возвращал совпадение).

Ниже приведен пример использования.*\n.* как грубый способ преодоления разрыва между группами захвата путем сопоставления любых символов, не являющихся символом новой строки, после последней группы захвата, затем сопоставления с новой строкой, а затем сопоставления с любыми символами без перевода строки, которые предшествуют следующему захвату.группа (вы, вероятно, хотите быть более точным, чем это, но это демонстрирует проблему).Я включил только ваши первые 3 группы, потому что я не следовал тому, что вы хотели с помощью регулярного выражения в вашей <clash_status> группе.

import re

text = '\n\n\nName: Clash1\nDistance: -1.274m\nImage Location: navis_raport_txt_files\\cd000001.jpg\nHardStatus: New\nClash Point: 1585.236m, 193.413m'

clash_data = re.compile(r'(?P<clash_number>Clash\d+).*\n.*'
                        r'(?P<clash_depth>\d.\d{3}).*\n.*'
                        r'(?P<image_location>cd\d+.jpg)', re.I | re.VERBOSE)

result = clash_data.search(text).groupdict()

print(result)
# OUTPUT
# {'clash_number': 'Clash1', 'clash_depth': '1.274', 'image_location': 'cd000001.jpg'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...