Escape della stringa regex in Python


229

Voglio usare l'input di un utente come modello regex per una ricerca su del testo. Funziona, ma come posso gestire i casi in cui l'utente inserisce caratteri che hanno significato in regex? Ad esempio, l'utente desidera cercare Word (s): regex engine prenderà il (s)gruppo. Voglio che lo tratti come una corda "(s)". Posso eseguire replacel'input dell'utente e sostituire il (con \(e il )con \)ma il problema è che dovrò sostituirlo per ogni possibile simbolo regex. Conosci un modo migliore?

Risposte:


324

Utilizzare la re.escape()funzione per questo:

4.2.3 reContenuto del modulo

fuga (stringa)

Restituisce la stringa con tutte le barre non alfanumeriche inverse; questo è utile se si desidera abbinare una stringa letterale arbitraria che può contenere metacaratteri di espressione regolare.

Un esempio semplicistico, cerca l'eventuale occorrenza della stringa fornita seguita facoltativamente da 's' e restituisce l'oggetto corrispondente.

def simplistic_plural(word, text):
    word_or_plural = re.escape(word) + 's?'
    return re.match(word_or_plural, text)

53

Puoi usare re.escape () :

re.escape (stringa) Restituisce la stringa con tutti i caratteri non alfanumerici retrocessi; questo è utile se si desidera abbinare una stringa letterale arbitraria che può contenere metacaratteri di espressione regolare.

>>> import re
>>> re.escape('^a.*$')
'\\^a\\.\\*\\$'

3

Sfortunatamente, re.escape()non è adatto per la stringa di sostituzione:

>>> re.sub('a', re.escape('_'), 'aa')
'\\_\\_'

Una soluzione è mettere la sostituzione in una lambda:

>>> re.sub('a', lambda _: '_', 'aa')
'__'

perché il valore di ritorno della lambda viene trattato re.sub()come una stringa letterale.


3
L' replargomento re.subè una stringa, non una regex; applicarlo re.escapenon ha alcun senso in primo luogo.
triplo il

5
@tripleee Non è corretto, l' replargomento non è una stringa semplice, ma viene analizzato. Ad esempio, re.sub(r'(.)', r'\1', 'X')tornerà X, no \1.
Flimm,

4
Ecco la domanda rilevante per sfuggire replall'argomento: stackoverflow.com/q/49943270/247696
Flimm

3
Modificato nella versione 3.3: il carattere '_' non viene più salvato. Modificato nella versione 3.7: Vengono sfuggiti solo i caratteri che possono avere un significato speciale in un'espressione regolare. (Perché ci è voluto così tanto tempo?)
Cees Timmerman l'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.