Esci dai caratteri speciali regex in una stringa Python


126

Python ha una funzione che posso usare per sfuggire a caratteri speciali in un'espressione regolare?

Ad esempio, I'm "stuck" :\dovrebbe diventare I\'m \"stuck\" :\\.


2
Cosa consideri un personaggio speciale?
pafcu,

1
Dipende completamente dal tuo contesto. Di solito quei personaggi vanno benissimo quando li hai dentro una stringa.
colpì il

possibile duplicato della stringa regex di
escape

Risposte:


197

Uso re.escape

>>> import re
>>> re.escape(r'\ a.*$')
'\\\\\\ a\\.\\*\\$'
>>> print(re.escape(r'\ a.*$'))
\\\ a\.\*\$
>>> re.escape('www.stackoverflow.com')
'www\\.stackoverflow\\.com'
>>> print(re.escape('www.stackoverflow.com'))
www\.stackoverflow\.com

Ripetendolo qui:

re.escape (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.

A partire da Python 3.7 è re.escape()stato modificato per sfuggire solo ai personaggi significativi per le operazioni regex.


1
È possibile utilizzare il modulo regex invece di re. Un esempio potrebbe essere regex.escape(pattern,string,special_only=True
Lokinou,

17

Sono sorpreso che nessuno abbia menzionato l'uso di espressioni regolari tramite re.sub():

import re
print re.sub(r'([\"])',    r'\\\1', 'it\'s "this"')  # it's \"this\"
print re.sub(r"([\'])",    r'\\\1', 'it\'s "this"')  # it\'s "this"
print re.sub(r'([\" \'])', r'\\\1', 'it\'s "this"')  # it\'s\ \"this\"

Cose importanti da notare:

  • Nel modello di ricerca , includi \anche i personaggi che stai cercando. Utilizzerai \per sfuggire ai tuoi personaggi, quindi devi sfuggire anche a quello .
  • Metti le parentesi attorno al modello di ricerca , ad esempio ([\"]), in modo che il modello di sostituzione possa usare il carattere trovato quando viene aggiunto \davanti a esso. (Questo è quello che \1 fa: usa il valore del primo gruppo tra parentesi.)
  • Il rdavanti r'([\"])'è una stringa non elaborata . Le stringhe non elaborate utilizzano regole diverse per sfuggire alle barre rovesciate. Per scrivere ([\"])come una semplice stringa, dovresti raddoppiare tutte le barre rovesciate e scrivere '([\\"])'. Le stringhe non elaborate sono più amichevoli quando scrivi espressioni regolari.
  • Nel modello di sostituzione , è necessario scappare \per distinguerlo da una barra rovesciata che precede un gruppo di sostituzione, ad esempio \1, quindi r'\\\1'. Per scrivere che come una stringa semplice, avresti bisogno '\\\\\\1'- e nessuno vuole questo.

9

Usa repr () [1: -1]. In questo caso, le doppie virgolette non devono essere salvate. La sezione [-1: 1] serve per rimuovere la singola citazione dall'inizio e dalla fine.

>>> x = raw_input()
I'm "stuck" :\
>>> print x
I'm "stuck" :\
>>> print repr(x)[1:-1]
I\'m "stuck" :\\

O forse vuoi semplicemente sfuggire a una frase da incollare nel tuo programma? In tal caso, procedere come segue:

>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'

3
Questo non funziona se la stringa è unicode, perché avrai te e dovresti eseguirerepr(x)[2:-1]
Antoine Pelisse l'

In python3.4, dove tutte le stringhe sono unicode, purtroppo questo non sembra funzionare affatto. Invece, print(repr("I'm stuck")[1:-1])stampa I'm stuck.
Dantiston,

3

Come è stato menzionato sopra, la risposta dipende dal tuo caso. Se vuoi scappare da una stringa per un'espressione regolare, allora dovresti usare re.escape (). Ma se vuoi sfuggire a uno specifico set di caratteri, usa questa funzione lambda:

>>> escape = lambda s, escapechar, specialchars: "".join(escapechar + c if c in specialchars or c == escapechar else c for c in s)
>>> s = raw_input()
I'm "stuck" :\
>>> print s
I'm "stuck" :\
>>> print escape(s, "\\", ['"'])
I'm \"stuck\" :\\

1

Non è così difficile:

def escapeSpecialCharacters ( text, characters ):
    for character in characters:
        text = text.replace( character, '\\' + character )
    return text

>>> escapeSpecialCharacters( 'I\'m "stuck" :\\', '\'"' )
'I\\\'m \\"stuck\\" :\\'
>>> print( _ )
I\'m \"stuck\" :\

3
Se la barra rovesciata è una delle, charactersè meglio che sia la prima!
Steveha,

0

Se vuoi solo sostituire alcuni caratteri puoi usare questo:

import re

print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")
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.