Pandas 使用 jupyter,如何过滤有效的电子邮件格式和数据框中过长的行?

Pandas with jupyter, how filter a valid email format and excessive length rows in dataframe?

我有一个数据框,我想通过排除列中不是电子邮件的所有内容来过滤“电子邮件”列,示例:

email;credit;name;data
test1@aol.com;123;lucash;02-07-2021
test2_test@hotmail.com;223;mary;01-07-2021
hshdgdhsj"";324;fabian;29-06-2021
test3lol_@gmail.com;11;scot;20-06-2021
qweryiij;444;giusy;16-06-2021
ted@mail.com;149;ted;11-06-2021;tedted

我使用 pandas,我只需要以有效电子邮件开头的行,以及不超过三 (3) 个分号 (;) 的行,如下所示:

email;credit;name;data
test1@aol.com;123;lucash;02-07-2021
test2_test@hotmail.com;223;mary;01-07-2021
test3lol_@gmail.com;11;scot;20-06-2021

是一个大文件,正在打开:

df = pd.read_csv(r'test.csv', sep = ';',error_bad_lines=False,encoding='utf8',engine='python')
df

你对如何进行有什么建议吗? 谢谢!!!!

你可以使用 str.extract():

pat=r'([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)'
df['email']=df['email'].str.extract(pat,expand=False)
df=df.dropna(subset=['email'])

正则解释:

首先,我们有匹配大写单词、小写单词数字、unserscore、句点、加号或连字符的字符集,然后我们有匹配一个或多个出现的 + 号,直到 @:

[a-zA-Z0-9_.+-]+@

对于域,我们有另一个字符集匹配大写单词、小写单词、数字和连字符后跟 + 号,它将匹配它的 1 次或多次出现,直到找到句点 (.):

[a-zA-Z0-9-]+\.

在那段时间之后,我们有另一个字符集,它将匹配大写单词、小写单词、数字、连字符和一个句点和 + sigh,它将匹配它的 1 次或多次出现

[a-zA-Z0-9-.]+