Регулярные выражения Pyton - Найдите все предложения, начинающиеся с символа дефиса, и поместите их в список - PullRequest
0 голосов
/ 10 июля 2020

У меня есть текстовый файл, который я хочу проанализировать и поместить вопросы и варианты в список вопросов и вариантов

пример текста: [ОБНОВЛЕН ТЕКСТ ПРИМЕРА, ВКЛЮЧАЯ ВСЕ ВИДЫ ВАРИАЦИЙ В ТИПЫ ВОПРОСОВ И ОПЦИИ]

- 26 yrs Man Hbsag +ve ,hbeag +ve on routine screening ..what is next ; IM
A. observe
B. HBV DNA study\
C. Interferon
D. take liver biopsy
- Trauma è skin erythema and Partiel skin loss ,ttt: surgery
A. H2o irrigation
B. Bicarb. Irrigation
C. Surgical debridment\
- Old female, obese on diet control ,polydipsia , invest. Hba1c 7.5 ,all (random,
Fasting, post prandial ) sugar are mild elevated urine ketone (+) ttt: IM
A. Insulin “ ketonuria “\
B. pioglitazone
C. Thiazolidinediones
D. fourth i forgot (not Metformin nor sulfonylurea)
- Day to day variation of this not suitable for patients under warfarin therapy: IM
A. retinols
B. Fresh fruits and vegitables
C. Meet and paultry\
D. Old cheese

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

Также регулярное выражение для извлечения каждого набора параметров в список. Итак, конечный результат будет:

question list = ['- 26 yrs Man Hbsag +ve ,hbeag +ve on routine screening ..what is next ; IM','- Old female, obese on diet control ,polydipsia , invest. Hba1c 7.5 ,all (random,Fasting, post prandial ) sugar are mild elevated urine ketone (+) ttt:IM ','etc','and so on']
options list = [['A. observe','B. HBV DNA study\','C. Interferon','D. take liver biopsy'],['A. H2o irrigation\','B. Bicarb. Irrigation','C. Surgical debridment',[['A. Something Else','B. Something Else',......,'D.  ']],[etc]]

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

import re

with open("julysmalltext.txt") as file:
    content = file.read()
    question_list = re.findall(r'', content)
    options_list = re.findall(r'', content)

Ответы [ 3 ]

0 голосов
/ 10 июля 2020

Это сделает это:

import re
 
with open("data.txt") as fp:
    question_list = list()
    options_list = list()
    for line in fp.readlines():
        question = re.match(r'-.*', line)
        if question:
            question_list.append(question.group(0))
        else:
            answer = re.match(r'[ABCD]\..*', line)
            if answer.group(0)[0]=='A':
                options_list.append([answer.group(0)])
            else:
                options_list[-1].append(answer.group(0))

print(question_list)
print(options_list)

Вывод:

['- 26 yrs Man Hbsag +ve ,hbeag +ve on routine screening ..what is next ;IM', '- Trauma è skin erythema and Partiel skin loss ,ttt: surgery']
[['A. observe', 'B. HBV DNA study', 'C. Interferon', 'D. take liver biopsy'], ['A. H2o irrigation', 'B. Bicarb. Irrigation', 'C. Surgical debridment']]

Другой вариант, если вам не нужен список вложенных вопросов:

import re

with open("data.txt") as file:
    content = file.read()
    question_list = re.findall(r'-.*', content)
    options_list = re.findall(r'[ABCD]\..*', content)

print(question_list)
print(options_list)

Выход:

['- 26 yrs Man Hbsag +ve ,hbeag +ve on routine screening ..what is next ;IM', '- Trauma è skin erythema and Partiel skin loss ,ttt: surgery']
['A. observe', 'B. HBV DNA study', 'C. Interferon', 'D. take liver biopsy', 'A. H2o irrigation', 'B. Bicarb. Irrigation', 'C. Surgical debridment']
0 голосов
/ 10 июля 2020

Попробуйте этот пример.

import json

text = '''
- 26 yrs Man Hbsag +ve ,hbeag +ve on routine screening ..what is next ;IM
A. observe
B. HBV DNA study
C. Interferon
D. take liver biopsy
- Trauma è skin erythema and Partiel skin loss ,ttt: surgery
A. H2o irrigation\
B. Bicarb. Irrigation
C. Surgical debridment
'''

questions = {}
letters = ['A','B','C','D','E',]
text = text.split('\n')
text[:]          = [x for x in text if x]
question = ''
for line in text:
    if line[0] == '-':
        question = line[2:]
        questions[question] = {}
    elif line[0] in letters:
        line = line.split('.',1)
        for i in range(len(line)):
            line[i] = line[i].strip()
        questions[question][line[0]] = line[1]


print(json.dumps(questions,indent=2, ensure_ascii=False))

Вывод будет очень организованным:

{
  "26 yrs Man Hbsag +ve ,hbeag +ve on routine screening ..what is next ;IM": {
    "A": "observe",
    "B": "HBV DNA study",
    "C": "Interferon",
    "D": "take liver biopsy"
  },
  "Trauma è skin erythema and Partiel skin loss ,ttt: surgery": {
    "A": "H2o irrigationB. Bicarb. Irrigation",
    "C": "Surgical debridment"
  }
}
0 голосов
/ 10 июля 2020

Простой:

import re

with open("julysmalltext.txt") as file:
    content = file.read()

questions = re.findall('-.*?(?=\nA)', content)
options = re.findall('\w\..*?(?=\n)', content)

print(questions)
print(options)

Вывод:

['- 26 yrs Man Hbsag +ve ,hbeag +ve on routine screening ..what is next ;IM', '- Trauma è skin erythema and Partiel skin loss ,ttt: surgery']
['A. observe', 'B. HBV DNA study', 'C. Interferon', 'D. take liver biopsy', 'A. H2o irrigation\\', 'B. Bicarb. Irrigation']

Разбивка на части:

Эта часть: '-' означает, что строка должна начинаться с '-'
Эта часть: '.*?' означает извлекать все, что находится между ними, но не жадно.
Эта часть: '(?=\nA)' означает, что должна быть новая строка и 'A' прямо перед строкой.

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