我正在尝试使用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模块进行相同类型的匹配?
答案 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'))