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
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
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 \b
后 TEXTO
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")
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 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.