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