Регулярные выражения для захвата адресов электронной почты могут быть довольно запутанными, это используемое здесь - на полпути между сложностью и точностью.
^(([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,18}(?:\.[a-z]{2})?))$
Данные, используемые внутри файла XLS:
Excel вкладка файла Plan1 (данные хорошего поведения)
id, first_name, last_name, email, gender, ip_address
1, Bernarr, Readman, breadman0@phoca.cz, Male, 1.201.143.69
2, Nyssa, Rawet, nrawet1@biblegateway.com, Female, 240.226.205.57
3, Catherin, Bruins, cbruins2@webeden.co.uk, Female, 55.5.216.180
4, Doloritas, Arendt, darendt3@census.gov, Female, 120.253.124.157
5, Mackenzie, Kirsz, mkirsz4@nps.gov, Male, 5.237.249.9
вкладка файла Excel Plan2 (отдельные письма)
id, first_name, last_name, email, gender, ip_address
1, Benny, Philpots, bphilpots0@joomla.org, Female, 147.151.61.216
2, Karie, pcopo5@columbia.edu, no-email.here, Female, 219.167.139.86
3, Hedwig, Huckster, no-email.here, hhuckster2@e-recht24.de, 211.20.77.203
4, cseary3@uiuc.edu, Seary, no-email.here, Female, 0.217.162.126
5, Amara, Itchingham, no-email.here, Female, avlasin8@comsenz.com
Выполните итерацию над фреймом данных в виде списка df.values.tolist()
и попробуйте сопоставить каждый элемент с ожидаемым регулярным выражением.
import os
import pandas as pd
import re
regex = r"^(([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,18}(?:\.[a-z]{2})?))$"
path = "."
files = os.listdir(path)
print(files)
files_xls = [f for f in files if f[-4:] == 'xlsx']
files_xls.sort(key=lambda x: os.path.getmtime(x), reverse=True)
os.chdir(path)
df_email = pd.DataFrame()
for i in range(1): #Read the excel file with the most recent modified timestamp
print(files_xls[i])
xls = pd.ExcelFile(files_xls[i])
for sheet in xls.sheet_names:
df = pd.read_excel(files_xls[i], sheet_name=sheet)
for row in df.values.tolist():
for col in row:
matches = re.findall(regex, str(col))
if matches:
df_email = df_email.append([matches[0]], ignore_index=True)
print(df_email)
Вывод из df_email :
0 1 2 3
0 breadman0@phoca.cz breadman0 phoca cz
1 nrawet1@biblegateway.com nrawet1 biblegateway com
2 cbruins2@webeden.co.uk cbruins2 webeden.co uk
3 darendt3@census.gov darendt3 census gov
4 mkirsz4@nps.gov mkirsz4 nps gov
5 bphilpots0@joomla.org bphilpots0 joomla org
6 pcopo5@columbia.edu pcopo5 columbia edu
7 hhuckster2@e-recht24.de hhuckster2 e-recht24 de
8 cseary3@uiuc.edu cseary3 uiuc edu
9 avlasin8@comsenz.com avlasin8 comsenz com
Примечания:
- Вам по-прежнему нужно перебирать папку, чтобы прочитать каждый файл XLS.
- При создании этого примера реальным электронным письмам не было причинено вреда =)
- Сгенерированные данные с помощью Realisti c Генератор данных