Perl Skript in Python übersetzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mathrac
User
Beiträge: 1
Registriert: Donnerstag 6. September 2018, 10:46

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
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten