Est-ce que Python a une fonction que je peux utiliser pour échapper aux caractères spéciaux d'une expression régulière?
Par exemple, I'm "stuck" :\
devrait devenir I\'m \"stuck\" :\\
.
Utilisez 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
_
En le répétant ici:
re.escape (chaîne)
Renvoie une chaîne avec tous les caractères non alphanumériques inversés; Cela est utile si vous souhaitez faire correspondre une chaîne littérale arbitraire pouvant contenir des métacaractères d'expression régulière.
Je suis surpris que personne n'ait mentionné l'utilisation d'expressions régulières 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\"
Points importants à noter:
\
ainsi que le (s) caractère (s) recherché (s). Vous allez utiliser \
pour échapper à vos personnages. Vous devez donc également échapper à cela .([\"])
, de sorte que le modèle substitution puisse utiliser le caractère trouvé lorsqu'il ajoute \
devant celui-ci. (C'est ce que fait \1
: utilise la valeur du premier groupe entre parenthèses.)r
devant r'([\"])'
signifie qu'il s'agit d'une chaîne brute . Les chaînes brutes utilisent différentes règles pour échapper des barres obliques inverses. Pour écrire ([\"])
sous forme de chaîne simple, vous devez doubler toutes les barres obliques inverses et écrire '([\\"])'
. Les chaînes brutes sont plus conviviales lorsque vous écrivez des expressions régulières.\
pour le distinguer d'une barre oblique inverse précédant un groupe de substitution, par exemple. \1
, d'où r'\\\1'
. Pour écrire que en tant que chaîne simple, vous auriez besoin de '\\\\\\1'
- et personne ne le voudra.Utilisez repr () [1: -1]. Dans ce cas, il n'est pas nécessaire d'échapper aux guillemets. La tranche [-1: 1] consiste à supprimer la citation simple du début et de la fin.
>>> x = raw_input()
I'm "stuck" :\
>>> print x
I'm "stuck" :\
>>> print repr(x)[1:-1]
I\'m "stuck" :\\
Ou peut-être voulez-vous simplement échapper une phrase à coller dans votre programme? Si oui, faites ceci:
>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'
Comme il a été mentionné ci-dessus, la réponse dépend de votre cas. Si vous voulez échapper une chaîne pour une expression régulière, vous devez utiliser re.escape (). Mais si vous voulez échapper à un ensemble de caractères spécifique, utilisez cette fonction 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\" :\\
Ce n'est pas si dur:
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\" :\
Si vous souhaitez uniquement remplacer certains caractères, vous pouvez utiliser ceci:
import re
print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")