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\" :\\
.
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\" :\\
.
Risposte:
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.
regex.escape(pattern,string,special_only=True
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:
\
anche i personaggi che stai cercando. Utilizzerai \
per sfuggire ai tuoi personaggi, quindi devi sfuggire anche a
quello .([\"])
, 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.)r
davanti 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.\
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.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" :\\'
repr(x)[2:-1]
print(repr("I'm stuck")[1:-1])
stampa I'm stuck
.
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\" :\\
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\" :\
characters
è meglio che sia la prima!
Se vuoi solo sostituire alcuni caratteri puoi usare questo:
import re
print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")