регулярное выражение для извлечения нескольких шаблонов - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть такая строка

string="""Claim Status\r\n[Primary Status: Paidup to Rebilled]\r\nGeneral Info.\r\n[PA Number: #######]\r\nClaim Insurance: Modified\r\n[Ins. Mode: Primary], [Corrected Claim Checked], [ICN: #######], [Id: ########]"""

tokens=re.findall('(.*)\r\n(.*?:)(.*?])',string)

выход

 ('Claim Status', '[Primary Status:', ' Paidup to Rebilled]')
 ('General Info.', '[PA Number:', ' R180126187]')
 ('Claim Insurance: Modified', '[Ins. Mode:', ' Primary]')

Требуемый вывод:

 ('Claim Status', 'Primary Status:Paidup to Rebilled')
 ('General Info.', 'PA Number:R180126187')
 ('Claim Insurance: Modified', 'Ins. Mode:Primary','ICN: ########', 'Id: #########')

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Вы получаете три элемента на результат, потому что вы используете «захват» регулярных выражений. Перепишите ваше регулярное выражение следующим образом, чтобы объединить второе и третье совпадение:

re.findall('(.*)\r\n((?:.*?:)(?:.*?]))',string)

Группа, ограниченная (?:...) (вместо (...)), является "не захватывающей", то есть она не считается целью совпадения для \1 и т. Д., И она не "просматривается" re.findall. Я сделал так, чтобы обе ваши группы не захватывали, и добавил одну группу захвата (обычную) вокруг них.

0 голосов
/ 03 сентября 2018

Вы можете достичь того, что вам нужно, с помощью такого решения:

import re
s="""Claim Status\r\n[Primary Status: Paidup to Rebilled]\r\nGeneral Info.\r\n[PA Number: #######]\r\nClaim Insurance: Modified\r\n[Ins. Mode: Primary], [Corrected Claim Checked], [ICN: #######], [Id: ########]"""
res = []
for m in re.finditer(r'^(.+)(?:\r?\n\s*\[(.+)])?\r?$', s, re.M):
    t = []
    t.append(m.group(1).strip())
    if m.group(2):
        t.extend([x.strip() for x in m.group(2).strip().split('], [') if ':' in x])
    res.append(tuple(t))
print(res)

См. Онлайн-демонстрацию Python . Выход:

[('Claim Status', 'Primary Status: Paidup to Rebilled'), ('General Info.', 'PA Number: #######'), ('Claim Insurance: Modified', 'Ins. Mode: Primary', 'ICN: #######', 'Id: ########')]

С помощью регулярного выражения ^(.+)(?:\r?\n\s*\[(.+)])?\r?$ вы сопоставляете две последовательные строки, вторая из которых является необязательной (из-за необязательной группы без захвата (?:...)?), первая записывается в группу 1, а последующая (которая начинается с [ и заканчивается ]) заносится в Группу 2. (Обратите внимание, что \r?$ необходимо, поскольку в многострочном режиме $ соответствует только перед новой строкой, а не возвратом каретки.) Значение группы 1 добавляется к временный список, затем содержимое второй группы разделяется на ], [ (если вы не уверены в количестве пробелов, вы можете использовать re.split(r']\s*,\s*\[', m.group(2))), а затем добавлять только те элементы, которые содержат : в них, временный список.

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