Давайте разберем пример до чего-то более простого:
content = """
PMID- 22997744
OWN - NLM
TI - [Value of magnetic resonance imaging in the diagnosis of recurrent colorectal
cancer].
PG - 28-33
AB - To diagnose recurrent colorectal cancer is an urgent problem of oncoproctology.
Eighty patients with suspected recurrent colon tumor were examined.
FAU - Dan'ko, N A
MH - Aged
MH - Colon/pathology/surgery"""
Вы можете использовать регулярные выражения для сопоставления с шаблоном.Регулярные выражения являются мощным и мощным инструментом:
>>> match = re.search('^PMID- (.*)$', content, re.MULTILINE)
Шаблон ^PMID- (.*)$
соответствует началу строки ^
, затем следует PMID-
, затем несколько символов .
, затем конецлиния $
.Скобки (.*)
означают, что сопоставление результатов внутри скобок будет помещено в группу.Нам нужно проверить, было ли совпадение:
>>> match is not None
True
Мы можем запросить совпадение:
>>> match.groups()
('22997744',)
Итак, мы можем видеть, что есть одна группа (потому что мы определили только одну группу внаш шаблон), и он соответствует PMID: 22997744
.
Мы можем получить значение, запросив значение группы совпадений 1. Группа совпадений 0 - это вся строка, которая соответствует: PMID- 22997744
.
>>> pmid = match.group(1)
>>> pmid
'22997744'
Шаблон для сопоставления по нескольким строкам с TI
и AB
намного сложнее.Я не эксперт, возможно, кто-то еще скинется с чем-то лучшим.Я бы сначала сделал замену текста, чтобы весь текст был в одной строке.Например:
>>> text = """TI - [Value of magnetic resonance imaging in the diagnosis of recurrent colorectal
... cancer].
>>> print(text)
TI - [Value of magnetic resonance imaging in the diagnosis of recurrent colorectal
cancer].
>>> print(text.replace('\n ', ' '))
TI - [Value of magnetic resonance imaging in the diagnosis of recurrent colorectal cancer].
Тогда мы можем сопоставить TI
и AB
аналогичным образом:
>>> content = content.replace('\n ', ' ')
>>> match = re.search('^TI - (.*)$', content, re.MULTILINE)
>>> ti = match.group(1)
>>> ti
'[Value of magnetic resonance imaging in the diagnosis of recurrent colorectal cancer].'
>>> match = re.search('^AB - (.*)$', content, re.MULTILINE)
>>> ab = match.group(1)
>>> ab
'To diagnose recurrent colorectal cancer is an urgent problem of oncoproctology. Eighty patients with suspected recurrent colon tumor were examined'
Чтобы сопоставить MH
, мы хотим найти все совпадения.re.search
просто найдет первый матч.re.findall
вернет несколько совпадений:
>>> mh = re.findall('^MH - (.*)$', content, re.MULTILINE)
>>> mh
['Aged', 'Colon/pathology/surgery']
Собрав все это вместе:
data = {}
data[pmid] = {'Title': ti,
'Abstract': ab,
'MeSH': mh}
Это дает (используя pprint
чтобы он выглядел лучше):
>>> from pprint import pprint
>>> pprint(data)
{'22997744': {'Abstract': 'To diagnose recurrent colorectal cancer is an urgent problem of oncoproctology. Eighty patients with suspected recurrent colon tumor were examined.',
'MeSH': ['Aged', 'Colon/pathology/surgery'],
'Title': '[Value of magnetic resonance imaging in the diagnosis of recurrent colorectal cancer].'}}