我正在尝试清理包含许多格式错误的电子邮件地址的csv文件,例如:
"Scarpaci"
"Joseph" <scarp@vt.edu>"
"Adams"
"Robert" <robadams@localnet.com>"
显示两个地址,但在不同的行上有名字和姓氏。我需要一个正则表达式,1)识别多行地址,2)用一行的名字,姓氏和电子邮件地址替换它,但用双引号括起来的名字和姓氏。
使用Mac OS,无论有什么正则表达式引擎......
答案 0 :(得分:1)
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" scarp@vt.edu
"Adams Robert" robadams@localnet.com
$