374 Stimmen

Wie verwendet man eine Variable innerhalb eines regulären Ausdrucks?

Ich würde gerne eine variable innerhalb einer regex wie kann ich das in Python ?

TEXTO = sys.argv[1]

if re.search(r"\b(?=\w)TEXTO\b(?!\w)", subject, re.IGNORECASE):
    # Successful match
else:
    # Match attempt failed

350voto

Ned Batchelder Punkte 342778

Sie müssen den Regex als String erstellen:

TEXTO = sys.argv[1]
my_regex = r"\b(?=\w)" + re.escape(TEXTO) + r"\b(?!\w)"

if re.search(my_regex, subject, re.IGNORECASE):
    etc.

Beachten Sie die Verwendung von re.escape so dass Sonderzeichen in Ihrem Text nicht als solche interpretiert werden.

236voto

airborne Punkte 2984

Ab Python 3.6 können Sie auch Literal String Interpolation , "f-Strings". In Ihrem speziellen Fall würde die Lösung lauten:

if re.search(rf"\b(?=\w){TEXTO}\b(?!\w)", subject, re.IGNORECASE):
    ...do something

EDIT:

Da es in den Kommentaren einige Fragen zum Umgang mit Sonderzeichen gab, möchte ich meine Antwort erweitern:

rohe Zeichenketten ('r'):

Eines der wichtigsten Konzepte, das Sie verstehen müssen, wenn Sie mit Sonderzeichen in regulären Ausdrücken arbeiten, ist die Unterscheidung zwischen Zeichenkettenliteralen und dem regulären Ausdruck selbst. Dies wird sehr gut erklärt aquí :

Kurz gesagt:

Anstatt eine Wortgrenze zu finden, könnte man sagen \bTEXTO Sie wollen die Zeichenfolge \boundary . Das müssen Sie schreiben:

TEXTO = "Var"
subject = r"Var\boundary"

if re.search(rf"\b(?=\w){TEXTO}\\boundary(?!\w)", subject, re.IGNORECASE):
    print("match")

Dies funktioniert nur, weil wir eine rohe Zeichenkette verwenden (dem Regex wird ein 'r' vorangestellt), ansonsten müssen wir " \\\\boundary " in der Regex (vier Backslashes). Zusätzlich, ohne ' \r ', \b ' würde nicht mehr in eine Wortgrenze umgewandelt, sondern in eine Rücktaste!

re.escape :

Setzt grundsätzlich einen Backslash vor jedes Sonderzeichen. Wenn Sie also ein Sonderzeichen in TEXTO erwarten, müssen Sie schreiben:

if re.search(rf"\b(?=\w){re.escape(TEXTO)}\b(?!\w)", subject, re.IGNORECASE):
    print("match")

HINWEIS: Für jede Version >= python 3.7: ! , " , % , ' , , , / , : , ; , < , = , > , @ であり、また ` sind nicht entkommen. Nur Sonderzeichen, die in einer Regex eine Bedeutung haben, werden weiterhin mit Escape versehen. _ wird seit Python 3.3 nicht mehr escaped.(s. aquí )

Geschwungene Klammern:

Wenn Sie Quantoren innerhalb des regulären Ausdrucks mit f-Zeichenfolgen verwenden wollen, müssen Sie doppelte geschweifte Klammern verwenden. Nehmen wir an, Sie wollen TEXTO gefolgt von genau 2 Ziffern finden:

if re.search(rf"\b(?=\w){re.escape(TEXTO)}\d{{2}}\b(?!\w)", subject, re.IGNORECASE):
    print("match")

55voto

Bo Buchanan Punkte 677
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE):

Dadurch wird der Inhalt von TEXTO als Zeichenkette in die Regex eingefügt.

43voto

Cat Plus Plus Punkte 119072
rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO)

9voto

Deepak Nagarajan Punkte 131

Ich finde es sehr praktisch, ein Muster für einen regulären Ausdruck zu erstellen, indem man mehrere kleinere Muster aneinanderreiht.

import re

string = "begin:id1:tag:middl:id2:tag:id3:end"
re_str1 = r'(?<=(\S{5})):'
re_str2 = r'(id\d+):(?=tag:)'
re_pattern = re.compile(re_str1 + re_str2)
match = re_pattern.findall(string)
print(match)

Ausgabe:

[('begin', 'id1'), ('middl', 'id2')]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X