Python perl使用一行程序在同一行中捕获多个匹配项
我只想从文件中提取数字,并将其组织为CSV 发件人: 致: 我可以使用PythonPython perl使用一行程序在同一行中捕获多个匹配项,python,perl,Python,Perl,我只想从文件中提取数字,并将其组织为CSV 发件人: 致: 我可以使用Pythonre.findall(如下所示) perl实现这一点的方法是什么 试试这样的方法: # Declare the regex my $is_num = qr { (?: 0x[0-9a-fA-F]+ ) # Match stuff like 0x1B | # Or
re.findall
(如下所示)
perl实现这一点的方法是什么 试试这样的方法:
# Declare the regex
my $is_num = qr {
(?: 0x[0-9a-fA-F]+ ) # Match stuff like 0x1B
| # Or
\d+ (?: \.\d+ )? # 5 or 5.2
}x;
chomp(my @data = <DATA>);
for(@data){
my @new;
push @new, $1 while /($is_num)/g;
$_ = join ",", @new;
}
print "$_\n" for @data;
__DATA__
Aa:40, Bint:02 : Bstring = 0x13 Ccc Num = 52 Dfloat = 164.0
Aa:40, Bint:03 : Bstring = 0x1B Ccc Num = 10 Dfloat = 10.6
Aa:41, Bint:04 : Bstring = 0x1A Ccc Num = 10 Dfloat = 1.6
不过我相信有更好的方法。这是我第一次想到的试试这样:
# Declare the regex
my $is_num = qr {
(?: 0x[0-9a-fA-F]+ ) # Match stuff like 0x1B
| # Or
\d+ (?: \.\d+ )? # 5 or 5.2
}x;
chomp(my @data = <DATA>);
for(@data){
my @new;
push @new, $1 while /($is_num)/g;
$_ = join ",", @new;
}
print "$_\n" for @data;
__DATA__
Aa:40, Bint:02 : Bstring = 0x13 Ccc Num = 52 Dfloat = 164.0
Aa:40, Bint:03 : Bstring = 0x1B Ccc Num = 10 Dfloat = 10.6
Aa:41, Bint:04 : Bstring = 0x1A Ccc Num = 10 Dfloat = 1.6
不过我相信有更好的方法。这是我第一次想到另一种方式
另一种方式
foo.pl
-直接翻译python代码片段
%cat data.txt
Aa:40,Bint:02:Bstring=0x13 Ccc Num=52 Dfloat=164.0
Aa:40,Bint:03:Bstring=0x1B Ccc Num=10 Dfloat=10.6
Aa:41,Bint:04:Bstring=0x1A Ccc Num=10 Dfloat=1.6
%cat data.txt | perl foo.pl
40,02,0x13,52164.0
40,03,0x1B,10,10.6
41,04,0x1A,10,1.6
foo.pl
-直接翻译python代码片段
%cat data.txt
Aa:40,Bint:02:Bstring=0x13 Ccc Num=52 Dfloat=164.0
Aa:40,Bint:03:Bstring=0x1B Ccc Num=10 Dfloat=10.6
Aa:41,Bint:04:Bstring=0x1A Ccc Num=10 Dfloat=1.6
%cat data.txt | perl foo.pl
40,02,0x13,52164.0
40,03,0x1B,10,10.6
41,04,0x1A,10,1.6
您正在从字符串中提取数值
您可以通过以下方式完成此操作:
m/(\d+)/g;
当然,因为您还包括
和x
:
m/(\d[\d\.xA-F]+)/ig;
或作为一个班轮:
perl -nle 'print join ",", m/(\d[\d\.xA-F]+)/ig;'
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
print join(',', /(\d[\d\.xA-F]+)/gi);
}
是“在n
时将其包装起来” 这意味着您可以使用管道while(){
或在其后面指定一个文件,例如STDIN
perl-nle'print join',,m/(\d[\d\.xA-F]+)/gi;'somefile
是自动咀嚼。它l
换行,并在打印后重新添加chomps
正在执行此代码段e
perl -nle 'print join ",", m/(\d[\d\.xA-F]+)/ig;'
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
print join(',', /(\d[\d\.xA-F]+)/gi);
}
它看起来像您想要的输出。您正在从字符串中提取数值 您可以通过以下方式完成此操作:
m/(\d+)/g;
当然,因为您还包括
和x
:
m/(\d[\d\.xA-F]+)/ig;
或作为一个班轮:
perl -nle 'print join ",", m/(\d[\d\.xA-F]+)/ig;'
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
print join(',', /(\d[\d\.xA-F]+)/gi);
}
是“在n
时将其包装起来” 这意味着您可以使用管道while(){
或在其后面指定一个文件,例如STDIN
perl-nle'print join',,m/(\d[\d\.xA-F]+)/gi;'somefile
是自动咀嚼。它l
换行,并在打印后重新添加chomps
正在执行此代码段e
perl -nle 'print join ",", m/(\d[\d\.xA-F]+)/ig;'
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
print join(',', /(\d[\d\.xA-F]+)/gi);
}
这看起来像是您想要的输出。您的正则表达式当前不处理0x1B之类的数字。但是很容易修复。非常好!很高兴知道“-l”选项。您的正则表达式当前不处理0x1B之类的数字。但是很容易修复。非常好!很高兴知道“-l”选项。感谢您使用“join”。它还帮助我理解命令行选项“-l”和“-n”的含义。感谢您展示了“join”的用法。它还帮助我理解命令行选项“-l”和“-n”的含义。感谢regex--比我的更紧。感谢regex--比我的更紧。
40,02,0x13,52,164.0
40,03,0x1,10,10.6
41,04,0x1,10,1.6