O Python tem uma função que eu possa usar para escapar de caracteres especiais em uma expressão regular?
Por exemplo, I'm "stuck" :\
deve se tornar I\'m \"stuck\" :\\
.
O Python tem uma função que eu possa usar para escapar de caracteres especiais em uma expressão regular?
Por exemplo, I'm "stuck" :\
deve se tornar I\'m \"stuck\" :\\
.
Respostas:
Usar 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
Repetindo aqui:
re.escape (string)
Retornar string com todos os caracteres não alfanuméricos com barra invertida; isso é útil se você deseja corresponder a uma sequência literal arbitrária que pode conter metacaracteres de expressão regular.
A partir do Python 3.7 re.escape()
foi alterado para escapar apenas caracteres significativos para operações de regex.
regex.escape(pattern,string,special_only=True
Estou surpreso que ninguém tenha mencionado o uso de expressões regulares via 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\"
Coisas importantes a serem observadas:
\
os caracteres que você está procurando. Você estará usando \
para escapar de seus personagens, então você precisa escapar
disso também.([\"])
, para que o
padrão de substituição possa usar o caractere encontrado quando ele for adicionado \
à sua frente. (É o que
\1
faz: usa o valor do primeiro grupo entre parênteses.)r
frente de r'([\"])'
significa que é uma string crua . Sequências brutas usam regras diferentes para escapar de barras invertidas. Para escrever ([\"])
como uma sequência simples, você precisará dobrar todas as barras invertidas e escrever '([\\"])'
. Sequências brutas são mais amigáveis quando você escreve expressões regulares.\
para diferenciá-lo de uma barra invertida que precede um grupo de substituição, por exemplo \1
, portanto r'\\\1'
. Para escrever
isso como uma sequência simples, você precisaria '\\\\\\1'
- e ninguém quer isso.Use repr () [1: -1]. Nesse caso, as aspas duplas não precisam ser escapadas. A fatia [-1: 1] é para remover as aspas simples do começo e do fim.
>>> x = raw_input()
I'm "stuck" :\
>>> print x
I'm "stuck" :\
>>> print repr(x)[1:-1]
I\'m "stuck" :\\
Ou talvez você só queira escapar de uma frase para colar no seu programa? Se sim, faça o seguinte:
>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'
repr(x)[2:-1]
print(repr("I'm stuck")[1:-1])
imprime I'm stuck
.
Como foi mencionado acima, a resposta depende do seu caso. Se você quiser escapar de uma string para uma expressão regular, use re.escape (). Mas se você quiser escapar de um conjunto específico de caracteres, use esta função 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\" :\\
Não é tão difícil:
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
melhor que seja a primeira!
Se você deseja substituir apenas alguns caracteres, pode usar isso:
import re
print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")