Объединение Splitline (), Enumerate и RegEx для извлечения данных - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу вытащить имена и электронные письма из текстового файла. Я разделяю строки и перечисляю их, чтобы определить шаблоны RegEx. Не все имена имеют соответствующие электронные письма, поэтому я сначала перечислю имена.

Идентификация имен -> Поскольку между именами, которые я хочу, есть текст, каждому имени предшествует число. Вот так: enter image description here Между каждым номером / блоком текста я хочу найти письмо. Вот где я застрял. Я получаю синтаксическую ошибку в отмеченном коде ниже. Первый for-l oop работает, второй нет.

list = []


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

#k is the line counter, line is the text that is pulled out
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):
        list.append((k, line))


for i, name_tup in enumerate(list):

    l, name = name_tup
    **emails = re.findall(r"([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)", txt[l:list[min(l + 1, len(list))])**
    if emails:
        new_List.append(name, emails)
print(new_List)

1 Ответ

0 голосов
/ 22 апреля 2020
# first: don't use list as a variable name, you overwrite a builtin function
a_list = []
# second: use context manager
with open("/Users/me/Desktop/scrape.txt", "r", encoding="utf8") as f:
# third: readlines() is simpler than read().splitlines() and does not create a temporary file-sized string
    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))

# fourth: enumerate is unnecessary here
for (l, name) in a_list:
     # fifth: I'd rather split your instruction into two
     # sixth: a_list contains tuples, you need the first item in a tuple
     endpos = a_list[min(l + 1, len(a_list)-1)][0]
     # seventh: now you should see what your syntax error was - single ] where ]] should be
     # eighth: txt is a list, not a string - re.findall requires a string
     emails = re.findall(r"([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)", ''.join(txt[l:endpos]))
     if emails:
         # ninth: you want a tuple, make it a tuple
         new_List.append((name, emails))
print(new_List)

… и я совершенно уверен, что пропустил еще несколько проблем.

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