【发布时间】:2017-05-04 15:30:01
【问题描述】:
我正在尝试使用 perl 正则表达式来进行一些复杂的匹配。在 shell 中,它看起来像:
cut -f6 file.txt | perl -ne 'chomp; $col=$_; $clipped = 0; foreach($col =~ m/(\d+)S/g){ $clipped +=$_;} print $col,"\t",$clipped,"\n";'
这行得通,但是这个脚本的下游部分花费的时间太长,所以我想在 python 中执行此操作。
为清楚起见,perl 行是在文件的第六列中查找字符“S”之前的数字。可能有多个“S”,因此它会在任何“S”之前找到任何数字并将其存储,然后 $clipped 将这些数字相加。如果该列看起来像 12S1I100M37S,则 $clipped 的总和为 49,前面的 12S 和末尾的 37S。它忽略所有其他数字。
回到 python:使用 split()[5],我可以将第六列传递给一个变量,但我不知道如何将它传递给 subprocess.call('perl -ne etc')。
有人可以建议我如何做到这一点或如何使用 python re 模块进行相同类型的匹配吗?
【问题讨论】:
-
更简单:
perl -lane'$sum=0; $sum += $_ for $F[5] =~ /(\d+)S/g; print "$F[5]\t$sum"'。 (添加-F\t如果制表符分隔输入。)不知道为什么你认为这在 Python 中会更快(除非程序的其余部分是用 Python 编写的并且你想完全避免子进程,但你表示你仍然想要使用perl)。 -
这不是在 python 中更快的步骤 - 它是一个下游过程,但我想我也可以将它们全部包装在一个脚本中。那如何将 python 变量传递给 perl 行?
-
如果你想要一个脚本,为什么要问如何将变量传递给其他脚本?!
-
我将 perl 行称为 python 中的子进程。我在问如何将变量传递到 subprocess.call('perl)
-
@ikegami 有一个很好的观点 OP - 你可能应该改变你的标题,因为标题的要求和你真正想做的事情有些不同(XY problem)