Ab Python 3.6 können Sie auch die Literal String Interpolation "f-strings" verwenden. In Ihrem speziellen Fall wäre die Lösung:
if re.search(rf"\b(?=\w){TEXTO}\b(?!\w)", subject, re.IGNORECASE):...do something
BEARBEITEN:
Da der Kommentar einige Fragen zum Umgang mit Sonderzeichen enthält, möchte ich meine Antwort erweitern:
rohe Saiten ('r'):
Eines der Hauptkonzepte, die Sie beim Umgang mit Sonderzeichen in regulären Ausdrücken verstehen müssen, ist die Unterscheidung zwischen Zeichenfolgenliteralen und dem regulären Ausdruck selbst. Es ist sehr gut erklärt hier :
Zusamenfassend:
Nehmen wir an, anstatt eine Wortgrenze zu finden, \bnachdem TEXTOSie mit der Zeichenfolge übereinstimmen möchten \boundary. Das musst du schreiben:
Dies funktioniert nur, weil wir eine Rohzeichenfolge verwenden (vor dem regulären Ausdruck steht 'r'), andernfalls müssen wir "\\\\ Grenze" in den regulären Ausdruck schreiben (vier Backslashes). Außerdem würde \ b 'ohne' \ r 'nicht mehr in eine Wortgrenze konvertiert, sondern in eine Rücktaste!
re.escape :
Grundsätzlich wird vor jedem Sonderzeichen eine Rücktaste eingefügt. Wenn Sie also in TEXTO ein Sonderzeichen erwarten, müssen Sie Folgendes 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: !, ", %, ', ,, /, :, ;, <, =, >, @, und `sind nicht entgangen. Es werden nur noch Sonderzeichen mit Bedeutung in einem regulären Ausdruck maskiert. _wird seit Python 3.3 nicht mehr maskiert. (s. hier )
Geschweifte Klammern:
Wenn Sie Quantifizierer innerhalb des regulären Ausdrucks mit f-Strings verwenden möchten, müssen Sie doppelte geschweifte Klammern verwenden. Angenommen, Sie möchten mit TEXTO übereinstimmen, gefolgt von genau zwei Ziffern:
if re.search(rf"\b(?=\w){re.escape(TEXTO)}\d{{2}}\b(?!\w)", subject, re.IGNORECASE):print("match")
Ab 2020 ist dies die einfachste und pythonischste Methode, eine Variable in einem regulären Ausdruck zu verwenden
CONvid19
3
Dies ist definitiv ein WOW .
Jason Goal
2
kann jemand hier die Bedeutung von "rf" erklären
Harsha Reddy
1
@HarshaReddy: 'r': Diese Zeichenfolge ist eine Rohzeichenfolge: Wenn Sie sie nicht verwenden, wird '\ b' in das Backspace-Zeichen konvertiert ( docs.python.org/3/howto/regex.html#more- Musterkraft ). 'f' sagt Python, dass dies ein 'f-String' ist, s. Link oben, und ermöglicht es Ihnen, die Variable in die geschweiften Klammern zu schreiben
Luft
1
Entgeht dies Sonderzeichen in der ersetzten Zeichenfolge? Nur von einem kleinen Test scheint es nicht. re.escape()wird noch benötigt
Tugzrida
281
Sie müssen den regulären Ausdruck als Zeichenfolge erstellen:
Was ist, wenn Ihre Variable zuerst geht? r'' + foo + 'bar'?
deed02392
@ deed02392 r''nicht notwendig, wenn du das tust re.escape(foo), was du sowieso tun solltest. Eigentlich denke ich, reinterpretiert alles, was es gibt, als Unicode-Zeichenfolge, unabhängig davon, ob Sie ein Präfix verwenden roder nicht.
OJFord
Funktioniert .format () auch anstelle von re.escape oder ist re.escape () erforderlich?
Praxiteles
@praxiteles hast du die Antwort gefunden?
CONvid19
2
Ich bin mir nicht sicher, ob dies funktioniert. Ich brauche eine Gruppe, zu der die Variable gehört. Andere Antworten unten sehen dafür intuitiver aus und teilen den regulären Ausdruck nicht in mehrere Ausdrücke auf.
Guival
48
if re.search(r"\b(?<=\w)%s\b(?!\w)"% TEXTO, subject, re.IGNORECASE):
Dadurch wird das, was in TEXTO enthalten ist, als Zeichenfolge in den regulären Ausdruck eingefügt.
Ich musste nach Benutzernamen suchen, die einander ähnlich sind, und was Ned Batchelder sagte, war unglaublich hilfreich. Ich stellte jedoch fest, dass ich eine sauberere Ausgabe hatte, als ich re.compile verwendete, um meinen Forschungsbegriff zu erstellen:
print(matches[1])# prints one whole matching line (in this case, the first line)print(matches[1][3])# prints the fourth character group (established with the parentheses in the regex statement) of the first line.
Sie können auch das Format-Schlüsselwort verwenden. Die Format-Methode ersetzt den Platzhalter {} durch die Variable, die Sie als Argument an die Format-Methode übergeben haben.
if re.search(r"\b(?=\w)**{}**\b(?!\w)".**format(TEXTO)**, subject, re.IGNORECASE):# Successful match**strong text**else:# Match attempt failed
Antworten:
Ab Python 3.6 können Sie auch die Literal String Interpolation "f-strings" verwenden. In Ihrem speziellen Fall wäre die Lösung:
BEARBEITEN:
Da der Kommentar einige Fragen zum Umgang mit Sonderzeichen enthält, möchte ich meine Antwort erweitern:
rohe Saiten ('r'):
Eines der Hauptkonzepte, die Sie beim Umgang mit Sonderzeichen in regulären Ausdrücken verstehen müssen, ist die Unterscheidung zwischen Zeichenfolgenliteralen und dem regulären Ausdruck selbst. Es ist sehr gut erklärt hier :
Zusamenfassend:
Nehmen wir an, anstatt eine Wortgrenze zu finden,
\b
nachdemTEXTO
Sie mit der Zeichenfolge übereinstimmen möchten\boundary
. Das musst du schreiben:Dies funktioniert nur, weil wir eine Rohzeichenfolge verwenden (vor dem regulären Ausdruck steht 'r'), andernfalls müssen wir "\\\\ Grenze" in den regulären Ausdruck schreiben (vier Backslashes). Außerdem würde \ b 'ohne' \ r 'nicht mehr in eine Wortgrenze konvertiert, sondern in eine Rücktaste!
re.escape :
Grundsätzlich wird vor jedem Sonderzeichen eine Rücktaste eingefügt. Wenn Sie also in TEXTO ein Sonderzeichen erwarten, müssen Sie Folgendes schreiben:
HINWEIS: Für jede Version> = Python 3.7:
!
,"
,%
,'
,,
,/
,:
,;
,<
,=
,>
,@
, und`
sind nicht entgangen. Es werden nur noch Sonderzeichen mit Bedeutung in einem regulären Ausdruck maskiert._
wird seit Python 3.3 nicht mehr maskiert. (s. hier )Geschweifte Klammern:
Wenn Sie Quantifizierer innerhalb des regulären Ausdrucks mit f-Strings verwenden möchten, müssen Sie doppelte geschweifte Klammern verwenden. Angenommen, Sie möchten mit TEXTO übereinstimmen, gefolgt von genau zwei Ziffern:
quelle
re.escape()
wird noch benötigtSie müssen den regulären Ausdruck als Zeichenfolge erstellen:
Beachten Sie die Verwendung von,
re.escape
damit Ihr Text Sonderzeichen nicht als solche interpretiert.quelle
r'' + foo + 'bar'
?r''
nicht notwendig, wenn du das tustre.escape(foo)
, was du sowieso tun solltest. Eigentlich denke ich,re
interpretiert alles, was es gibt, als Unicode-Zeichenfolge, unabhängig davon, ob Sie ein Präfix verwendenr
oder nicht.Dadurch wird das, was in TEXTO enthalten ist, als Zeichenfolge in den regulären Ausdruck eingefügt.
quelle
quelle
Ich finde es sehr praktisch, ein Muster für reguläre Ausdrücke zu erstellen, indem mehrere kleinere Muster aneinandergereiht werden.
Ausgabe:
quelle
Ich stimme allen oben genannten Punkten zu, es sei denn:
sys.argv[1]
war so etwas wieChicken\d{2}-\d{2}An\s*important\s*anchor
Sie möchten nicht verwenden
re.escape
, da Sie in diesem Fall möchten, dass es sich wie ein regulärer Ausdruck verhältquelle
Ich musste nach Benutzernamen suchen, die einander ähnlich sind, und was Ned Batchelder sagte, war unglaublich hilfreich. Ich stellte jedoch fest, dass ich eine sauberere Ausgabe hatte, als ich re.compile verwendete, um meinen Forschungsbegriff zu erstellen:
Die Ausgabe kann wie folgt gedruckt werden:
quelle
Sie können eine andere Verwendung mit
format
Grammer Suger versuchen :quelle
Sie können auch das Format-Schlüsselwort verwenden. Die Format-Methode ersetzt den Platzhalter {} durch die Variable, die Sie als Argument an die Format-Methode übergeben haben.
quelle
mehr Beispiel
Ich habe configus.yml mit Flows-Dateien
im Python-Code verwende ich
quelle