2017-05-04 59 views
0

我想用perl正则表达式来做一些复杂的匹配。在外壳,它看起来像:如何发送python变量到perl子进程

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”之前找到任何数字并存储该数字,然后$剪辑将总结这些数字。如果该列看起来像12S1I100M37S,那么$剪辑将总共为49,前面的12S和最后的37S。它会忽略所有其他数字。使用split()[5],我可以得到第六列的变量,但我不知道如何将它传递给subprocess.call('perl -ne etc')。

有人可以建议我怎么能做到这一点或如何使用python re模块进行相同类型的匹配?

+3

简单:'perl -lane'$ sum = 0; $ sum + = $ _ for $ F [5] =〜/(\ d +)S/g;打印“$ F [5] \ t $ sum”''。 (如果是制表符分隔的输入,则添加'-F \ t')。不知道为什么你认为Python的速度会更快(除非程序的其余部分是用Python编写的,并且你想完全避免子进程,但是你指示了你仍然想使用'perl')。 – ikegami

+0

这不是python中速度更快的步骤 - 它是一个下游过程,但我想我可能会把它们全部包装在一个脚本中。 这是如何将一个python变量传递给perl行的? – nietzschemouse

+2

如果你想要一个单独的脚本,你为什么要问如何将变量传递给其他脚本? – ikegami

回答

2

最有可能的一种更紧凑的方式来写在Python中。这只是我的尝试,从字面上看你的问题定义/边界。无论如何,要指出的是,如果你想坚持使用Python,使用re模块肯定是一个简单的选择。

import re 

def sum_str_digits(my_string): 
    split_string = re.split(r'(\d+)', my_string) 
    sums = 0 
    for index, string_piece in enumerate(split_string): 
     if string_piece == 'S': 
      sums += int(split_string[index - 1]) 
    return sums 

# For Python 2.x 
print sum_str_digits(my_string='12S1I100M37S') 

# Python 3.x 
print(sum_str_digits(my_string='12S1I100M37S')) 
+0

我使用python3.5,并需要将打印语句包装在圆括号中,但这是完美的,否则。谢谢! – nietzschemouse