Seite 1 von 1

Perl Skript in Python übersetzen

Verfasst: Donnerstag 6. September 2018, 11:11
von mathrac
Hallo ihre Lieben,

ich bin neu im Forum und auch gerade dabei Python Kenntnisse mir anzueignen. Eine Aufgabe/Problem das ich gerade hab ist folgendes:

Ich habe folgenden Perl-Code:

Code: Alles auswählen

if ($l_AC =~ /(-.+)/)
{
push(@results_AC,$1);
}
else
{
die "Unexpected output produced by phyml: $l_AC\n";
}
den ich jetzt in ein Python-Code umschreiben will. Dazu ersteinmal ein paar Informationen. l_AC ist ein String der folgendes enthält: "grep 'BEST SCORE FOUND'iqtree_create_trees_datasets_PolyMoSim.py_AC.log" .
results_AC ist hier noch ein leeres Array welches ich am Anfang mit "results_AD = []" definiert habe, der dann durch die if Anweisung befüllt werden soll. Dazu habe ich folgenden Code aufgestellt:

Code: Alles auswählen

if re.match(l_AD,r'/(-.+)/'):
results_AD.append(l_AD)
else: print("Unexpected output produced by phyml: " + l_AD)
Die Bedeutung der Variablen ist die Gleiche wie oben. Das Problem was ich habe ist, dass er mir beim Ausführen immer den Code von else ausführt und ausgibt. Ich habe darum die Vermutung dass er das /(-.+)/ nicht richtig lesen kann. Um ehrlich zu sein weiß ich auch absolut nicht wie ich das aus Perl in Python übersetzten kann.

Ich freue mich über jede Hilfe und danke euch schon mal!
Beste Grüße

Re: Perl Skript in Python übersetzen

Verfasst: Donnerstag 6. September 2018, 11:19
von __deets__
Dein regulaerer Ausdruck sagt "jeder String, der mit - anfaengt, und danach egal was enthaelt". Dein Beispliestring enstpricht dem nicht, also kommt es zur Ausfuehrung des else.

Re: Perl Skript in Python übersetzen

Verfasst: Donnerstag 6. September 2018, 11:52
von __blackjack__
@mathrac: `$l_AC` enthält in dem Perl-Programm ziemlich wahrscheinlich nicht 'grep …' sondern die *Ausgabe* von diesem ``grep``-Aufruf oder zumindest eine Zeile davon. Wahrscheinlich aber mehr, denn sonst würde der '.+'-Teil im regulären Ausdruck keinen Sinn machen, denn das sind beliebige Zeichen *bis zum Zeilenende*. Und nur das was gematcht wird, wird auch an `@results_AC` angehängt, nicht das ganze `$l_AC`! Das ist in Deinem Code ja noch anders.

In Deinem regulären Ausdruck sind die '/' zu viel. Die gehören in Perl ja nicht zum Ausdruck selbst, sondern kennzeichnen ihn ja nur, wie Anführungszeichen bei Zeichenkettenliteralen ja auch nur die Zeichenkette im Quelltext abgrenzen, aber selbst nicht mit in der Zeichenkette enthalten sind.

Edit: Jetzt ist die Frage was `$l_AC` *tatsächlich* enthält, und falls es die komplette Ausgabe von dem ``grep`` ist, ob da wirklich nur die erste Zeile benutzt und der Rest verworfen wird. Denn dann kann man dem ``grep`` Arbeit ersparen. Beziehungsweise würde ich das komplett in Python lösen. Und auch für Perl finde ich es komisch das so ein einfaches ``grep`` als externes Programm aufgerufen wird.

Re: Perl Skript in Python übersetzen

Verfasst: Donnerstag 6. September 2018, 12:22
von __blackjack__
@mathrac: Du brauchst `re.search()` weil `re.match()` implizit am Anfang der Zeichenkette verankert ist, der reguläre Ausdruck im Perl-Programm das aber nicht hat.

Code: Alles auswählen

#!/usr/bin/env python3
import re


def main():
    results = list()
    l_ac = 'spam\nthis does not match-\nignored -dead parrot\nmore drivel\n'
    
    match = re.search('(-.+)', l_ac)
    if match:
        results.append(match.group(1))
    else:
        raise ValueError(f'Unexpected output produced by phyml: {l_ac!r}')
    
    print(results)


if __name__ == '__main__':
    main()