Выражение регулятора в python - PullRequest
0 голосов
/ 09 мая 2020

У меня есть этот текст:

DIAGNOSIS
M19.072 Primary osteoarthritis, left ankle and foot 1
M19.072 Primary osteoarthritis, left ankle and foot 2
O   RTHOSIS DEVICE(S) PRESCRIBED

gfgfgfggfgfg
111111111112ffffffffff
gfggggg

DIAGNOSIS
M17.12 Unilateral primary osteoarthritis, left knee
O   RTHOSIS DEVICE(S) PRESCRIBED

gfgfgfggfgfg
11111ttttfffff

gffffffffffffffffffffffffwwwwwwwwwree


DIAGNOSIS
M75.42 Impingement syndrome of left shoulder
O   RTHOSIS DEVICE(S) PRESCRIBED

gfgfgfggfgfg
111111111112ffffffffff

gfggggg
wwwwwwwwww

, и я хочу получить только эти три строки !!!!

M19.072 Primary osteoarthritis, left ankle and foot 1
M19.072 Primary osteoarthritis, left ankle and foot 2
M17.12 Unilateral primary osteoarthritis, left knee
M75.42 Impingement syndrome of left shoulder

это мой код python, но иногда он не работал !

diagnosis_Answer = re.findall(r"(DIAGNOSIS(\s.*?)+RTHOSIS DEVICE)+", txt)

Ответы [ 3 ]

1 голос
/ 09 мая 2020

Вы можете использовать

DIAGNOSIS((?:\n.*)*?)\n.*RTHOSIS DEVICE

См. Демонстрацию regex . Подробности :

  • DIAGNOSIS\n - DIAGNOSIS и новая строка
  • ((?:\n.*)*?) - Группа 1: ноль или больше (но как можно меньше) появления символа новой строки, а затем любых 0 или более символов, кроме символов разрыва строки, как можно больше
  • \n - новая строка
  • .*RTHOSIS DEVICE - любых 0 или более символов, кроме символов разрыва строки, как можно больше, а затем RTHOSIS DEVICE строка.

Python демонстрация :

import re
txt = 'DIAGNOSIS\nM19.072 Primary osteoarthritis, left ankle and foot 1\nM19.072 Primary osteoarthritis, left ankle and foot 2\nO   RTHOSIS DEVICE(S) PRESCRIBED\n\ngfgfgfggfgfg\n111111111112ffffffffff\ngfggggg\nwwwwwwwwww\n\nDIAGNOSIS\nM17.12 Unilateral primary osteoarthritis, left knee\nO   RTHOSIS DEVICE(S) PRESCRIBED\n\n\ngfgfgfggfgfg\n11111ttttfffff\ngffffffffffffffffffffffffwwwwwwwwwree\n\nDIAGNOSIS\nM75.42 Impingement syndrome of left shoulder\nO   RTHOSIS DEVICE(S) PRESCRIBED\n\n\ngfgfgfggfgfg\n111111111112ffffffffff\ngfggggg\nwwwwwwwwww\n'
diagnosis_Answer = []
matches = re.findall(r"DIAGNOSIS((?:\n.*)*?)\n.*RTHOSIS DEVICE", txt)
for m in matches:
    diagnosis_Answer.extend(m.strip().splitlines())
print(diagnosis_Answer)

Вывод:

['M19.072 Primary osteoarthritis, left ankle and foot 1', 'M19.072 Primary osteoarthritis, left ankle and foot 2', 'M17.12 Unilateral primary osteoarthritis, left knee', 'M75.42 Impingement syndrome of left shoulder']
0 голосов
/ 09 мая 2020

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

DIAGNOSIS\n+?(.*)\n+?.*RTHOSIS DEVICE

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

Теперь это будет соответствовать всей строке. Что вас может заинтересовать, так это группы! Так что ознакомьтесь с этим учебным пособием , в котором подробно рассказывается о группах в python RE.

0 голосов
/ 09 мая 2020

Я бы посоветовал вам просто взять строки с хорошим началом M\d{2}\.\d+.*, M и цифрами

diagnosis_Answer = re.findall(r"M\d{2}\.\d+.*", text)

Если вы хотите воплотить свою идею в соответствие DIAGNOSIS до и RTHOSIS после, вам нужно добавить символ линии разрыва DIAGNOSIS\n+(.*)\n+.*RTHOSIS DEVICE

diagnosis_Answer = re.findall(r"DIAGNOSIS\n+(.*)\n+.*RTHOSIS DEVICE", text)

OnlineDemo

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