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?

  • Parse-Tabellennamen aus einem Bündel SQL-Anweisungen
  • MySQLdb und Python ImportError
  • Erstellen eines Countdown-Timers in python / opencv
  • Sellerie widerruft Aufgabe vor der Ausführung mit django Datenbank
  • Python - Druckausgabe mit Komma getrennt
  • Suchen Sie eine Liste von Strings für einen beliebigen Unterstring aus einer anderen Liste
  • 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.

  • Ist deleteLater () in PyQt / PySide notwendig?
  • Wie würde ich eine Django App verpacken und verkaufen?
  • Installiere PIL in Ubuntu 12.04 Python 2.7 und Python 3.2
  • Python: Gemeinsamen Code unter einer Familie von Skripten teilen
  • Wie skaliere man Bilder auf Bildschirmgröße in Pygame
  • Ressourcen für TDD auf Python Web Development ausgerichtet
  • 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.