Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python perl使用一行程序在同一行中捕获多个匹配项_Python_Perl - Fatal编程技术网

Python perl使用一行程序在同一行中捕获多个匹配项

Python 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

我只想从文件中提取数字,并将其组织为CSV

发件人:

致:

我可以使用Python
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