Разделение текста / обработка текста с помощью регулярных выражений - PullRequest
0 голосов
/ 18 октября 2019

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

Вот текст (одна строка):

"Evaluation Note: Suspected abuse by own mother. Date 3/13/2019 ID: #N/A Contact: Not Specified Name: Cecilia Valore Address: 189 West Moncler Drive Home Phone: 353 273 400 Additional Information: Please tell me when the mother arrives, we will have a meeting with her next Monday, 3/17/2019 Author: social worker"

Поэтому я хочу отделить этот абзац на основе имен переменных, используя python. «Примечание об оценке», «Дата», «Идентификатор», «Контакт», «Имя», «Адрес», «Домашний телефон», «Дополнительная информация» и «Автор» являются именами переменных. Я думаю, что использование регулярных выражений кажется хорошим, но у меня нет большого опыта в регулярных выражениях.

Вот что я пытаюсь сделать:

import re

regex = r"Evaluation Note(?:\:)? (?P<note>\D+) Date(?:\:)? (?P<date>\D+)
ID(?:\:)? (?P<id>\D+) Contact(?:\:)? (?P<contact>\D+)Name(?:\:)? (? P<name>\D+)"

test_str = "Evaluation Note: Suspected abuse by own mother. Date 3/13/2019
ID: #N/A Contact: Not Specified Name: Cecilia Valore "

matches = re.finditer(regex, test_str, re.MULTILINE)

Но не находит никаких шаблонов.

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Вы можете использовать search , чтобы получить местоположения переменных и соответственно проанализировать текст. Вы можете легко настроить его.

import re
en = re.compile('Evaluation Note:').search(text)
print(en.group())
d = re.compile('Date').search(text)
print(text[en.end()+1: d.start()-1])
print(d.group())
i_d = re.compile('ID:').search(text)
print(text[d.end()+1: i_d.start()-1])
print(i_d.group())
c = re.compile('Contact:').search(text)
print(text[i_d.end()+1: c.start()-1])
print(c.group())
n = re.compile('Name:').search(text)
print(text[c.end()+1: n.start()-1])
print(n.group())
ad = re.compile('Address:').search(text)
print(text[n.end()+1: ad.start()-1])
print(ad.group())
p = re.compile('Home Phone:').search(text)
print(text[ad.end()+1: p.start()-1])
print(p.group())
ai = re.compile('Additional Information:').search(text)
print(text[p.end()+1: ai.start()-1])
print(ai.group())
aut = re.compile('Author:').search(text)
print(text[ai.end()+1: aut.start()-1])
print(aut.group())
print(text[aut.end()+1:])

это приведет к выводу:

Примечание по оценке: подозрение на жестокое обращение со стороны собственной матери.

Дата: 13.03.2009

ID: # N / A

Контакт: Не указано

Имя: Сесилия Валоре

Адрес: 189 West Moncler Drive

Домашний телефон: 353 273 400

Дополнительная информация: Скажите, пожалуйста, когда приедет мать, у нас будет встреча с ней в следующий понедельник, 3/17/2019

Автор: социальный работник

Надеюсь, это поможет

0 голосов
/ 18 октября 2019

Вы, вероятно, можете сгенерировать это регулярное выражение на лету. Пока порядок параметров фиксирован.

Вот моя попытка, он делает свою работу. Фактическое регулярное выражение, для которого он стреляет, выглядит как Some Key(?P<some_key>.*)Some Other Key(?P<some_other_key>.*) и т. Д.

import re

test_str = r'Evaluation Note: Suspected abuse by own mother. Date 3/13/2019 ID: #N/A Contact: Not Specified Name: Cecilia Valore '
keys = ['Evaluation Note', 'Date', 'ID', 'Contact', 'Name']

def find(keys, string):
    keys = [(key, key.replace(' ', '_')) for key in keys] # spaces aren't valid param names
    pattern = ''.join([f'{key}(?P<{name}>.*)' for key, name in keys]) # generate the actual regex
    for find in re.findall(pattern, test_str):
        for item in find:
            yield item.strip(':').strip() # clean up the result

for find in find(keys, test_str):
    print(find)

, который возвращает:

Suspected abuse by own mother.
3/13/2019
#N/A
Not Specified
Cecilia Valore
...