如何将python变量发送到perl子进程

时间:2017-05-04 15:30:02

标签: python regex perl

我正在尝试使用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,则$ cliped总共为49,前面的12S和末尾的37S。它忽略了所有其他数字。

回到python:使用split()[5],我可以将第六列变为变量,但我不知道如何将它传递给subprocess.call('perl -ne etc')。

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

1 个答案:

答案 0 :(得分: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'))