Machen Sie Regex Match dotfiles genau

Also habe ich die Grenze meiner Regex-Fähigkeiten mit diesem getroffen. Ich habe hier eine Python-Regex, um einen Dateipfad oder eine Datei uri mit benannten Capture-Gruppen für die verschiedenen Teile zu passen. Es scheint, Arbeitsdatei zu sein, außer auf dotfiles.

MATCH_PATH = re.compile( r"^(?P<uri>file://)?" + # optional file uri r"(?P<path>(?:/?[AZ]{1}:)?" + # start of path capture, optional windows top-level directory r"[\\/]?" + # optional start separator r"(?:[\w \-\.]+[\\/])+)" + # path r"(?P<filename>[\w \-]+)?" + # optional filename r"\.?(?P<extension>[a-zA-Z0-9]+)?$" # extension optional ) 

Ich kann es passieren dotfiles durch das Entfernen der optionalen Qualifikation ? Nach dem . In der Erweiterung Teil, aber dann kann es nicht passen Dateien ohne Erweiterung (zB Makefile) noch Verzeichnisse. Ich habe versucht, eine Non-Capture-Gruppe um den Punkt und die Erweiterungsgruppe mit dem optionalen Qualifier zu platzieren , das hat nicht funktioniert: Die Erweiterung wird mit dem Dateinamen gruppiert. Kann ich dies anpassen, um die Erweiterung und den Namen korrekt in allen Fällen zu entsprechen, während immer noch passende Verzeichnisse?

Beispiele für Eingaben:

 /foo/bar.txt /foo/bar/ /foo/makefile ./foo.txt /foo/._bar.txt foo/bar.txt D:\foo\bar.m3u file:///var/www/html/index.html file:///C:/users/me/My Documents/index.html 

AKTUALISIEREN

Muss auch richtig passen

 /foo/bar.tar.gz /foo/._bar.tar.gz 

tar.gz die Erweiterung tar.gz und die Namen bar und ._bar sind. Bitte lassen Sie mich auch wissen, ob dies zu komplex für regex ist und ich kann prozeduralen Code schreiben, um zu teilen und zu verarbeiten statt.

  • Regex, um Ziffern bestimmter Länge zu entsprechen
  • Pandas - filtern und regex den Index von DataFrame durchsuchen
  • Python - Mit regex, um mehrere Spiele zu finden und auszudrucken
  • Duplikate mit Regex entfernen?
  • Erhaltene Gruppe in einer Zeile
  • Reguläre Ausdrücke und Zeichencodes in Scrapy-Exportdaten
  • Parsing einer kontextfreien Grammatik in Python
  • Ersetzen Sie exakte Teilstring in Python [duplicate]
  • 2 Solutions collect form web for “Machen Sie Regex Match dotfiles genau”

    Sie können sehr gut benannten gefangenen Gruppen in einem lookahead verwenden, wie folgt:

     ^ (?P<uri>file://)? (?P<path>(?:/?[AZ]{1}:)? # start of path capture, optional windows top-level directory [\\/]? # optional start separator (?:[-. \w]+[\\/])+) # path (?P<filename>\.?[^.]+?(?=\.(?P<extension>.+$)|$))? 

    Sehen Sie eine Demo auf regex101.com .


    Nur was ich geändert habe, ist die gruppendateiname:

     (?P<filename>\.?[^.]+?(?=\.(?P<extension>.+$)|$)) 

    Es benutzt einen faulen Punkt-Stern mit einem positiven Blickkopf, der entweder nach .some_extension (dann, der es zur extension speichert) oder das Ende der Linie schaut.

    Ich habe es geschafft, ein bisschen aufzuräumen und die Regex zu bekommen, um alle Ihre Beispieldaten zu vergleichen. Hier gibt es Testumgebung, so dass Sie sehen können, dass es mit den verschiedenen Erfassungsgruppen arbeitet.

     ^(?P<uri>file:\/\/\/)? (?P<path>(?:\/|\\|\.)?(?:[AZ]:(?:\/|\\))?(?:[\w \-\.]+[\/\\])+) (?P<file>\.?[\_\w ]+)? (?P<extension>\.[\w\d]+)?$ 

    Ich denke, das Hauptproblem mit dem, das Sie haben, ist, dass Sie nicht die Möglichkeit der vorherigen enthalten . In der file erfassen Gruppe. Um das zu beheben, fügte ich es als ein optionales voraus . Mit der file und bearbeitete das.

    Die andere kleine Veränderung, die ich gemacht habe, war inklusive der Erweiterung . In der extension , aber das kann geändert werden, wenn du willst.

    Python ist die beste Programmiersprache der Welt.