RegEx, чтобы охватить несколько строк - PullRequest
3 голосов
/ 14 апреля 2020

У меня есть текстовый файл с множеством неструктурированных данных, из которых я пытаюсь получить имена и даты рождения, используя 1 RegEx. Стена, на которую я натолкнулся, состоит в том, что даты могут заканчиваться в одной строке и продолжаться в другой, и re.DOTALL, похоже, не работает. Формат данных, которые я хочу, всегда:

фамилия, отчество (иногда), имя, f. ДД-ММ-ГГГГ

Это мой RegEx:

re.findall(r'\w+,*\sf\.\s\d\d-\d\d-\d\d\d\d', re.DOTALL):

Это не дает следующие разрывы строк:

Смит, Джон,

ф. 25-12-1990

или только первая часть ниже:

Smith, John, f. 25-12-

1990

Смит, Джон, ф. 25-

12-1990

1 Ответ

3 голосов
/ 14 апреля 2020

Если вы хотите, чтобы все параметры соответствовали датам на возможных символах новой строки, вы можете повторить символ пробела 0+ раз между всеми символами.

Обратите внимание, что в вашем шаблоне вы повторяете запятую 0+ раз ,* вместо \s

Использование re.DOTALL приводит к совпадению . с новой строкой, но в вашем шаблоне вы не используете точку, только буквальную точку \.

\s будет соответствовать символу пробела, включая символ новой строки. В ваших данных есть несколько новых строк между частью даты. Вы также можете использовать [\r\n]* для сопоставления строк между ними.

\w+,\s*f\s*\.\s*\d\s*\d\s*-\s*\d\s*\d\s*-\s*\d\s*\d\s*\d\s*\d

Regex demo | Python demo

Если перерыв идет только после дефиса:

\w+,\s*f\s*\.\s*\d\d-\s*\d\d-\s*\d\d\d\d

Regex demo | Python демо

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