Ich versuche, die folgende Perl regex ich im Video::Filename Perl-Modul zu einem Python 2.5.4 regex, einen Dateinamen zu analysieren gefunden zu konvertierenWie kann ich einen Perl-Regex mit benannten Gruppen in Python konvertieren?
# Perl > v5.10
re => '^(?:(?<name>.*?)[\/\s._-]*)?(?<openb>\[)?(?<season>\d{1,2})[x\/](?<episode>\d{1,2})(?:-(?:\k<season>x)?(?<endep>\d{1,2}))?(?(<openb>)\])(?:[\s._-]*(?<epname>[^\/]+?))?$',
Ich mag würde zu benannten Gruppen verwenden, und ich weiß, in Python Die Regex-Erweiterung für benannte Gruppen ist anders, aber ich bin mir nicht 100% ig sicher in der Syntax. Diese
ist, was ich versucht:
# Python (not working)
r = re.compile(r'^(?:(?P<name>.*?)[\/\s._-]*)?(?P<openb>\[)?(?P<season>\d{1,2})[x\/](?P<episode>\d{1,2})(?:-(?:\kP<season>x)?(?P<endep>\d{1,2}))?(?(P<openb>)\])(?:[\s._-]*(?P<epname>[^\/]+?))?$')
Der Fehler erhalte ich:
raise error, v # invalid expression
sre_constants.error: bad character in group name
Zum Beispiel diese, die ich konvertieren verwaltet und es funktioniert. Aber das obige kann ich nicht richtig verstehen. Ich erhalte einen Kompilierungsfehler in Python.
# Perl:
re => '^(?:(?<name>.*?)[\/\s._-]+)?(?:s|se|season|series)[\s._-]?(?<season>\d{1,2})[x\/\s._-]*(?:e|ep|episode|[\/\s._-]+)[\s._-]?(?<episode>\d{1,2})(?:-?(?:(?:e|ep)[\s._]*)?(?<endep>\d{1,2}))?(?:[\s._]?(?:p|part)[\s._]?(?<part>\d+))?(?<subep>[a-z])?(?:[\/\s._-]*(?<epname>[^\/]+?))?$',
# Python (working):
r = re.compile(r'^(?:(?P<name>.*?)[\/\s._-]+)?(?:s|se|season|series)[\s._-]?(?P<season>\d{1,2})[x\/\s._-]*(?:e|ep|episode|[\/\s._-]+)[\s._-]?(?P<episode>\d{1,2})(?:-?(?:(?:e|ep)[\s._]*)?(?P<endep>\d{1,2}))?(?:[\s._]?(?:p|part)[\s._]?(?P<part>\d+))?(?P<subep>[a-z])?(?:[\/\s._-]*(?P<epname>[^\/]+?))?$')
Ich bin mir nicht sicher, wo ich anfangen soll.
Hmm In Perl bedeutet \ k eine Rückreferenz zu einer zuvor definierten benannten Gruppe, daher ist es normal (in diesem Fall), den Namen zweimal in derselben Regex zu haben. –
Ah, ich verstehe. Dann muss das in eine (? P = Name) Referenz umgewandelt werden, denke ich. Aktualisieren .. –
Nun, da die perlre man-Seite vollständig keine benannten Muster oder Rückreferenzen zu ihnen erwähnt, und ich momentan knapp bei der Zeit bin, werden wir das als eine Übung für den Leser für jetzt lassen. –