Вы можете достичь того, что вам нужно, с помощью такого решения:
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))
), а затем добавлять только те элементы, которые содержат :
в них, временный список.