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

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

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

Это мой RegEx:

if re.findall(r'\w+,\s*f\s*\.\s*\d\s*\d\s*-\s*\d\s*\d\s*-\s*\d\s*\d\s*\d\s*\d', line):

Это не означает разрыв строки ниже:

Smith, John,

f. 25-12-1990

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

Smith, John, f. 25-12-

1990

Smith, John, f. 25-

12-1990

Вот полный код:

import re
import pandas as pd

a_list = []

f = open("/Users/me/Desktop/scrape.txt", "r", encoding="utf8")
txt = f.readlines()

for k, line in enumerate(txt):
    if re.findall(r'\w+,\s*f\s*\.\s*\d\s*\d\s*-\s*\d\s*\d\s*-\s*\d\s*\d\s*\d\s*\d', line):
        a_list.append((k, line))
print(a_list)


#df1 = pd.DataFrame(a_list)
#df1.to_csv('C:/Users/me/Desktop/outputs.csv', index=False)

f.close()

Пример данных: enter image description here

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Вы перебираете строки файла и передаете только каждую строку за раз findall. Регулярное выражение может работать только с тем, что вы ему даете, поэтому очевидно, что оно не может соответствовать тому, что вы ему не передали. Вам придется искать весь файл сразу:

import re

a_list = []

with open("/Users/me/Desktop/scrape.txt", encoding="utf8") as f:
    txt = f.read()

    print(re.findall(r'\w+,\s*f\s*\.\s*\d\s*\d\s*-\s*\d\s*\d\s*-\s*\d\s*\d\s*\d\s*\d', txt)
0 голосов
/ 23 апреля 2020

Ваше регулярное выражение, кажется, работает. Во-первых, вы можете проверить его здесь: https://regex101.com/r/yWrCig/1 Это соответствует 3 случаям.

Что касается вашего кода, используйте его следующим образом:

res = regex.findall(r'\w+,\s*f\s*\.\s*\d\s*\d\s*-\s*\d\s*\d\s*-\s*\d\s*\d\s*\d\s*\d', line)
if res:
    ...

Где 'res '- список совпадающих строк.

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