我试图清理一个包含许多格式错误的电子邮件地址的csv文件,例如:
"Scarpaci"
"Joseph" <[email protected]>"
"Adams"
"Robert" <[email protected]>"
它显示了两个地址,但在单独的行上有名字和姓氏。我需要一个正则表达式,1)识别多行地址,2)用一行的名字,姓氏和电子邮件地址替换它,但用双引号括起来的名字和姓氏。
我使用Mac OS,无论是什么正则表达式引擎...
Perl对此很有好处。将记录分隔符设置为与记录结尾匹配的内容,而不是默认值(即换行符):
local $/ = '>"';
然后你可以像往常一样“逐行”地阅读它并以这种方式清理它。这样的东西应该有助于循环,使用Perl的修饰符,因此换行是正常的,而x用于记录它的注释:
/\"([^\"]+)\".+? # first name
\"([^\"]+)\"\s+ # second name
<(.+)>\"* # email
/xs or next;
您的输出将类似于"$1 $2" $3
,包含捕获的组。
这适用于MacOS。
#!/usr/bin/perl -l
local $/ = '>"';
while (<>) {
/\"([^\"]+)\".+? # first name
\"([^\"]+)\"\s+ # second name
<(.+)>\"* # email
/xs or next;
print qq["$1 $2" $3];
}
非毛产量:
$ perl that-script.pl < that-data.txt
"Scarpaci Joseph" [email protected]
"Adams Robert" [email protected]
$