Вы хотите одно регулярное выражение, которое сканирует строку, которая охватывает две строки. Затем вы хотите найти последовательные совпадения. Но сначала:
Имена, по крайней мере в sh говорящих на английском языке странах, могут содержать дефисы (Anne-Mar ie), апострофы (O'Donnell), точки (John Q. Publi c) ) и др. c. Поэтому я использую регулярное выражение, которое позволяет эти символы. Кроме того, люди могут иметь более одного второго имени. Я пытаюсь проиллюстрировать, как перебирать пары имя / год; вы можете настроить фактическое регулярное выражение в соответствии со своими требованиями.
Регулярное выражение:
^(?P<name>(?:[a-z.'-]+(?:\s+[a-z.'-]+)*))\n(?P<year>\d{4})$ Flags: re.M|re.I
^
Соответствует началу строки. [a-z.'-]+
Соответствует одному или нескольким буквам, точкам, 'или символам. Это элемент имени . (?:\s+[a-z.'-]+)*
Соответствует одному или нескольким пробельным символам, за которыми следует элемент имени . Это повторяется 0 или более раз. Таким образом, именованная группа name состоит из 1 или более элементов name , разделенных одним или несколькими пробелами. \n
Соответствует новой строке. (?P<year>\d{4})$
Соответствует 4 цифрам, за которыми следует конец строки или конец строки.
Флаг MULTILINE обрабатывает специальные привязки ^
и $
, так что они совпадают в дополнение к начало и конец строки, начало и конец строки.
Код полагается на re.finditer
для поиска последовательных совпадений:
import re
text = """John Doe
1921
John Q. Public
1987
Anne-Marie Smith
1989
Paul O'Donnell
2001
J. P. Marquand
1893
"""
regexp = re.compile(r"^(?P<name>(?:[a-z.'-]+(?:\s+[a-z.'-]+)*))\n(?P<year>\d{4})$", flags=re.M|re.I)
for m in regexp.finditer(text):
name = m['name']
year = m['year']
# do something with name and year in the second file. Here we are just printing the values.
print(name, year)
Печать:
John Doe 1921
John Q. Public 1987
Anne-Marie Smith 1989
Paul O'Donnell 2001
J. P. Marquand 1893