2016-08-11 5 views
0

Ich muss nach Mustern suchen, die viele Metazeichen haben können. Zur Zeit verwende ich einen langen Regex.Escape alle Metazeichen in Python

prodObjMatcher=re.compile(r"""^(?P<nodeName>[\w\/\:\[\]\<\>\@\$]+)""", re.S|re.M|re.I|re.X) 

(mein tatsächliches Muster sehr lang ist, so klebe ich nur einigen relevanten Abschnitt, an das ich brauche Hilfe)

Dies ist besonders schmerzhaft, wenn ich brauche, um Kombinationen solcher Muster in einer einzigen Wiederzusammenstellung zu schreiben.

Gibt es einen pythonischen Weg zur Verkürzung der Musterlänge?

+1

Warum verwenden '. *?' Am Ende, wenn es eine leere Zeichenfolge entspricht? Außerdem müssen Sie * überhaupt * keine Zeichen in der Zeichenklasse * außer den Kurzschreibeklassen '^', '-','] 'und' '' '' 'entkommen lassen. Es gibt Methoden, um auch diejenigen (außer '' '' '' '' '' '' '' '' '' '' '' '' ') in der Zeichenklasse zu behalten. –

+2

Zusätzlich zu den Kommentaren riecht das nach einem Job für 'xml' ** parsing ** (Knotenname ???). – Jan

+0

@ WiktorStribiżew *** mein aktuelles Muster ist sehr lang, also habe ich gerade einige relevante Teile eingefügt, auf denen ich Hilfe brauche *** .Wäre toll, eine Antwort auf das zu bekommen, was gefragt wurde. Ich bin noch kein Experte für Regex in Python, also generell Metazeichen entkommen. Wahrscheinlich wird im Laufe der Zeit lernen, auf welcher Flucht und welche nicht. –

Antwort

2

Schauen Sie, können Sie Ihr Muster

r"""^(?P<nodeName>[]\w/:[<>@$]+).*?""" 

Hinweis

reduziert werden, die Sie -, ] entkommen müssen, nicht immer alle Nicht-Wort-Zeichen in den Zeichenklassen, mit Ausnahme der Kurzschreibweise Klassen, ^ und \. Es gibt Möglichkeiten, auch diejenigen zu halten (mit Ausnahme \) unescaped in der Zeichenklasse:

  • ] zu Beginn der Zeichenklasse
  • - am Anfang/Ende der Zeichenklasse
  • ^ - sollte nur maskiert werden, wenn Sie es am Anfang der Zeichenklasse als Literalsymbol platzieren.

Außerhalb einer Zeichenklasse, müssen Sie \, [, (, ), +, $, ^, *, ?, . entkommen.

Beachten Sie, dass / kein spezielles Regex-Metazeichen in Python-Regex-Mustern ist und nicht maskiert werden muss.

Verwenden Sie Raw-String-Literale beim Definieren Ihrer Regex-Muster, um Probleme zu vermeiden (wie verwirrende Wortgrenzen r'\b' und eine Rücktaste '\b').

+1

Danke das ist nützliche Information. –