【问题标题】:How to send a python variable to a perl subprocess如何将 python 变量发送到 perl 子进程
【发布时间】: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

标签: python regex perl


【解决方案1】:

很可能有一种更紧凑的方式可以用 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'))

【讨论】:

  • 我正在使用 python3.5 并且需要将 print 语句包装在括号中,但这是完美的,否则。谢谢!
猜你喜欢
  • 2012-10-01
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多