Как правильно извлечь данные с помощью регулярных выражений - PullRequest
0 голосов
/ 23 июля 2010

Я впервые сталкиваюсь с выражениями регулярных выражений, и мне нужно извлечь некоторые данные из этого отчета (текстовый файл с информацией о форматировании):

\ n10: Vikelis M, Rapoport AM.Роль противоэпилептических препаратов как профилактических средств при \ nmigraine.ЦНС Наркотики.2010 янв. 1; 24 (1): 21-33.DOI: \ n10.2165 / 11310970-000000000-00000.Обзор.PubMed PMID: 20030417. \ n \ n \ n21: Йоханнесен Лэндмарк С, Ларссон П.Г., Риттер Е., Йоханнессен С.И.Противоэпилептические препараты при эпилепсии и других расстройствах - популяционное исследование рецептов. \ NEpilepsy Res.2009 ноябрь; 87 (1): 31-9.Epub 2009 г., 13 августа. PubMed PMID: 19679449. \ n \ n \ n

Как видите, все записи txt начинаются с числа, такого как "xx:", и всегда заканчиваются "PubMed PMID:dddddddd., но с использованием RegEx, например:

regex = re.compile(r"^\d+: .+ PMID: \d{8}.$")
regex.findall(inputfile)

Дает мне список с одной большой строкой, поэтому я что-то неправильно понимаю. Как я могу извлечь данные из этих записей?

Ответы [ 2 ]

2 голосов
/ 23 июля 2010

Используйте .+? для сопоставления без жадности вместо .+, что дает жадное сопоставление. Вы также хотите, чтобы re.DOTALL удостоверился, что ваш . соответствует символам конца строки, которые ему нужны, и re.MULTILINE, чтобы убедиться, что ^ и $ совпадение начинается и заканчивается строкой, а не только всей строкой. Рассматриваемые параметры должны быть объединены с оператором «bit-OR» | и переданы в качестве второго аргумента в re.compile .

1 голос
/ 23 июля 2010

Если записи такие же непротиворечивые, как представлены в вашем примере, вам не нужно использовать регулярные выражения.Простое разбиение текстового файла на списки токенов поможет.Например:

txt = '\n10: Vikelis M, Rapoport AM. Role of antiepileptic drugs as preventive agents for \nmigraine. CNS Drugs. 2010 Jan 1;24(1):21-33. doi:\n10.2165/11310970-000000000-00000. Review. PubMed PMID: 20030417.\n\n\n21: Johannessen Landmark C, Larsson PG, Rytter E, Johannessen SI. Antiepileptic\ndrugs in epilepsy and other disorders--a population-based study of prescriptions.\nEpilepsy Res. 2009 Nov;87(1):31-9. Epub 2009 Aug 13. PubMed PMID: 19679449.\n\n\n'

lines = [token.replace('\n', '') for token in txt.split('.')]
for line in lines:
    print line

будет построчно печатать каждый элемент ваших ссылок:

10: Vikelis M, Rapoport AM
 Role of antiepileptic drugs as preventive agents for migraine
 CNS Drugs
 2010 Jan 1;24(1):21-33
 doi:10
2165/11310970-000000000-00000
 Review
 PubMed PMID: 20030417
21: Johannessen Landmark C, Larsson PG, Rytter E, Johannessen SI
 Antiepilepticdrugs in epilepsy and other disorders--a population-based study of prescriptions
Epilepsy Res
 2009 Nov;87(1):31-9
 Epub 2009 Aug 13
 PubMed PMID: 19679449

Опять же, если вы можете верить, что в первой строке записи есть автор;второй заголовок, третий журнал и т. д., вы можете сделать это очень быстро.Если информация немного более «контекстная», тогда вы можете НАЧАТЬ, используя regexp, на этом этапе.

Удачи.

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