Skip to main content
 首页 » 编程设计

python之perl 单行捕获同一行中的多个匹配项

2025年05月04日14bluestorm

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

来自:

  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 

到:

40,02,0x13,52,164.0 
40,03,0x1B,10,10.6 
41,04,0x1A,10,1.6 

我可以用 Python re.findall 来做到这一点(如下所示)

for line in sys.stdin: 
    print (",".join(re.findall(r'\d+.?\w+', line))) 

实现相同目标的 perl 方法是什么?

请您参考如下方法:

您正在从字符串中提取数值。

你可以这样做的方法是:

 m/(\d+)/g; 

当然,因为您还包括 .和 x :

 m/(\d[\d\.xA-F]+)/ig; 

或者作为一个类轮:

perl -nle 'print join ",",  m/(\d[\d\.xA-F]+)/ig;'  
  • n是“将其包装在 while ( <> ) { 中。

    这意味着您可以管道 STDIN或在其后指定一个文件 - 例如perl -nle 'print join ",", m/(\d[\d\.xA-F]+)/gi;' somefile cat somefile | perl -nle 'print join ",", m/(\d[\d\.xA-F]+)/gi;'

  • l是自动咀嚼。它chomps换行并在打印后重新添加它们

  • e正在执行此代码段。

这有效地构成了上面的一个衬垫:

BEGIN { $/ = "\n"; $\ = "\n"; } 
LINE: while (defined($_ = <ARGV>)) { 
    chomp $_; 
    print join(',', /(\d[\d\.xA-F]+)/gi); 
} 

这给;

40,02,0x13,52,164.0 
40,03,0x1,10,10.6 
41,04,0x1,10,1.6 

这看起来像您想要的输出。