Escapar caracteres especiais de regex em uma string Python

126

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

Wolfy
fonte
2
O que você considera um personagem especial?
pafcu
1
Depende completamente do seu contexto. Geralmente esses caracteres são totalmente bons quando você os possui dentro de uma string.
cutuca
possível duplicata de Escaping seqüência de regex em Python
Jukka Suomela

Respostas:

197

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.

pyfunc
fonte
1
Você pode usar o módulo regex em vez de re. Um exemplo seria regex.escape(pattern,string,special_only=True
Lokinou 5/11
17

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:

  • No padrão de pesquisa , inclua \os caracteres que você está procurando. Você estará usando \para escapar de seus personagens, então você precisa escapar disso também.
  • Coloque parênteses em torno do padrão de pesquisa , por exemplo ([\"]), para que o padrão de substituição possa usar o caractere encontrado quando ele for adicionado \à sua frente. (É o que \1faz: usa o valor do primeiro grupo entre parênteses.)
  • A rfrente 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.
  • No padrão de substituição , você precisa escapar \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.
Tim Ruddick
fonte
9

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" :\\'
dp_
fonte
3
Isso não funciona se a cadeia é Unicode, porque você vai ter u e deve ser executadorepr(x)[2:-1]
Antoine Pelisse
No python3.4, onde todas as strings são unicode, isso parece não funcionar, infelizmente. Em vez disso, print(repr("I'm stuck")[1:-1])imprime I'm stuck.
precisa saber é o seguinte
3

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\" :\\
spatar
fonte
1

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\" :\
cutucar
fonte
3
Se a barra invertida for uma das opções, é charactersmelhor que seja a primeira!
Steveha 06/06/12
0

Se você deseja substituir apenas alguns caracteres, pode usar isso:

import re

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