2016-04-26 6 views
0

Gibt es einen regulären Ausdruck, der dem some.prefix Teil der beiden folgenden Dateinamen entspricht?passender Dateiname mit regulärem Ausdruck mit mehreren Erweiterungen

  • xyz kann jedes Zeichen von [a-z0-9-_\ ]
  • some.prefix Teil sein kann, in [a-zA-Z0-9-_\.\ ] beliebiges Zeichen sein.

Ich habe absichtlich eine . in some.prefix enthalten.

some.prefix.xyz.xyz 
some.prefix.xyz 

Ich habe viele Kombinationen ausprobiert. Zum Beispiel:

(?P<prefix>[a-zA-Z0-9-_\.]+)(?:\.[a-z0-9]+\.gz|\.[a-z0-9]+) 

Es arbeitet mit abc.def.csv von abc.def fangen, diese aber nicht in abc.def.csv.gz zu fangen.

Ich benutze hauptsächlich Python, aber ich dachte, die Regex selbst sollte für viele Sprachen gelten.

Update: Es ist nicht möglich, siehe Diskussion mit @Nowox unten.

+0

Sprache/Werkzeug? – Tushar

+0

Entfernen Sie alles nach dem letzten '.' wird Dateiname geben. Ersetzen Sie '\. [^.] + $'. – Tushar

+0

Ich habe vergessen hinzuzufügen, dass der Präfixteil auch '\ .' enthalten kann. Jetzt hinzugefügt. Ich frage mich, ob es überhaupt möglich ist, solch eine Regex zu bekommen, erinnere mich vage daran, dass Regex irgendwie gierig ist. – zyxue

Antwort

1

Ich denke, Ihre regex ziemlich gut funktioniert. Ich empfehle Ihnen, zu versuchen, regex101 mit Ihrem Beispiel:

https://regex101.com/r/dV6cE8/3

Der Ausdruck

^(?i)[ \w-]+\.[ \w-]+ 

in Ihrem Fall funktionieren sollte:

som e.prefix.xyz.xyz 
^^^^^^^^^^^ 
some.prefix.xyz 
^^^^^^^^^^^ 
abc.def.csv.gz 
^^^^^^^ 

Und in Python können Sie:

import re 

text = """some.prefix.xyz.xyz 
some.prefix.xyz 
abc.def.csv.gz""" 

print re.findall('^(?i)[ \w-]+\.[ \w-]+', text, re.MULTILINE) 

Welche anzeigt:

['som e.prefix', 'some.prefix', 'abc.def'] 

Ich könnte denken, dass Sie ein wenig verwirrt über Ihre Anforderung sind. Wenn ich zusammenfassen, haben Sie einen Pfad aus chars und dot wie:

foo.bar.baz.0 
foobar.tar.gz 
f.o.o.b.a.r 

Wie würden Sie diese Zeichenfolge in einen Basis-Namen und eine Erweiterung trennen? Hier erkennen wir einige bekannte Muster .tar.gz ist definitiv eine Erweiterung, aber ist .bar.baz.0 die Erweiterung oder es ist nur .0?

Die Antwort ist nicht einfach und keine Regexes in dieser Welt wären in der Lage, die richtige Antwort zu 100% ohne einige Hinweise zu erraten.

Zum Beispiel können Sie die zulässigen Erweiterungen auflisten und einige Kriterien machen:

  • Eine Erweiterung passen die Regex \.\w{1,4}$
  • Mehrere Erweiterungen zusammen (\.\w{1,4}){1,4}$ verkettet werden können
  • Der verbleibende genannt wird der basename

Daraus können Sie diesen regulären Ausdruck erstellen:

(?P<basename>.*?)(?P<extension>(?:\.\w{1,4}){1,4})$ 
+0

Im ersten Beispiel möchte ich nur "some.prefix", keine "xyz". Im dritten Beispiel nur "abcdef", kein "csv". – zyxue

+0

Siehe mein Update ... – nowox

+0

Das scheint zu funktionieren. Ist es möglich, Platz zu betrachten, zum Beispiel 'some.pre fix.xyz.xyz' – zyxue

-1

Versuchen Sie, diese [a-z0-9-_\\]+\.[a-z0-9-_\\]+[a-zA-Z0-9-_\.\\]+

+0

Nein, es funktioniert überhaupt nicht. Sie können es hier testen, http://pythex.org/. – zyxue

+0

Es funktionierte für mich .. nur um klar zu sein, wollen Sie beide Ergebnisse übereinstimmen? – AJ333

+0

Ich möchte es in der Lage sein, den 'some.prefix' Teil eines Dateinamens zu extrahieren. Wenn der Dateiname beispielsweise "abc.def.csv.gz" lautet, sollte er "abc.def" aus den übereinstimmenden Ergebnissen extrahieren können. Sie benötigen wahrscheinlich eine Gruppierung in Ihrer Regex-Zeichenfolge (z. B. mit Klammern) – zyxue