2017-05-04 3 views
0

Ich versuche, eine Perl-Regex zu verwenden, um etwas komplizierten Abgleich durchzuführen. In der Schale, sieht es so aus:So senden Sie eine Python-Variable an einen Perl-Subprozess

cut -f6 file.txt | perl -ne 'chomp; $col=$_; $clipped = 0; foreach($col =~ m/(\d+)S/g){ $clipped +=$_;} print $col,"\t",$clipped,"\n";' 

Und das funktioniert, aber die nachgelagerten Teile dieses Skript zu lange einnehmen, so möchte ich dies in Python tun, statt.

Aus Gründen der Übersichtlichkeit findet die Perl-Zeile die Nummer vor dem Zeichen "S" in der sechsten Spalte der Datei. Es kann mehr als ein "S" geben, also findet es eine Ziffer vor jedem "S" und speichert diese, dann addiert $ clipped diese Ziffern. Wenn die Spalte wie 12S1I100M37S aussieht, würde $ clipped insgesamt 49 ergeben, für die 12S an der Front und die 37S am Ende. Es ignoriert alle anderen Ziffern.

Zurück zu Python: mit Split() [5], kann ich die sechste Spalte zu einer Variablen, aber ich weiß nicht, wie das an subprocess.call übergeben ('perl -ne etc').

Kann jemand vorschlagen, wie ich dies tun kann oder wie ich das Python Re-Modul für die gleiche Art der Übereinstimmung verwenden könnte?

+3

Einfacher: 'perl -lane '$ sum = 0; $ sum + = $ _ für $ F [5] = ~/(\ d +) S/g; drucke "$ F [5] \ t $ sum" ''. (Fügen Sie '-F \ t' hinzu, wenn die Eingabe durch Tabulatoren getrennt ist.) Nicht sicher, warum Sie denken, dass dies in Python schneller wäre (es sei denn, der Rest des Programms ist in Python geschrieben und Sie möchten den Unterprozess vollständig vermeiden, aber Sie haben Sie angegeben will immer noch 'perl' verwenden). – ikegami

+0

Es ist nicht dieser Schritt, der in Python schneller ist - es ist ein Downstream-Prozess, der ist, aber ich denke, ich kann sie alle in einem einzigen Skript zusammenfügen. Wie übergibt das eine Python-Variable an diese Perl-Zeile? – nietzschemouse

+2

Wenn Sie ein einzelnes Skript wünschen, warum fragen Sie, wie Sie Variablen an andere Skripte übergeben ?! – ikegami

Antwort

2

Es gibt wahrscheinlich eine Möglichkeit kompaktere Art und Weise, dies in Python zu schreiben. Dies ist nur mein Versuch, dich sehr wörtlich an deiner Problemdefinition/Grenze zu nehmen. Wie auch immer, Punkt sein, mit dem re Modul ist sicherlich eine einfache Option, wenn Sie bei Python bleiben wollen.

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

Ich benutze python3.5 und musste die print-Anweisung in runde Klammern setzen, aber das ist ansonsten perfekt. Vielen Dank! – nietzschemouse

Verwandte Themen