Python a-t-il une fonction que je peux utiliser pour échapper des caractères spéciaux dans une expression régulière?
Par exemple, I'm "stuck" :\
devrait devenir I\'m \"stuck\" :\\
.
Python a-t-il une fonction que je peux utiliser pour échapper des caractères spéciaux dans une expression régulière?
Par exemple, I'm "stuck" :\
devrait devenir I\'m \"stuck\" :\\
.
Réponses:
Utilisation 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
Répétez-le ici:
re.escape (chaîne)
Chaîne de retour avec tous les non-alphanumériques antislashés; ceci est utile si vous voulez faire correspondre une chaîne littérale arbitraire qui peut contenir des métacaractères d'expression régulière.
Depuis Python 3.7 a re.escape()
été modifié pour n'échapper que les caractères significatifs pour les opérations regex.
regex.escape(pattern,string,special_only=True
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 ou les caractères que vous recherchez. Vous allez utiliser \
pour échapper à vos personnages, vous devez échapper
que aussi bien.([\"])
, afin que le
modèle de substitution puisse utiliser le caractère trouvé quand il ajoute \
devant lui. (C'est ce que
\1
fait: utilise la valeur du premier groupe entre parenthèses.)r
devant r'([\"])'
signifie que c'est une chaîne brute . Les chaînes brutes utilisent des règles différentes pour échapper les contre-obliques. 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.\
à la distinguer d'une barre oblique inverse qui précède un groupe de substitution, par exemple \1
, par conséquent r'\\\1'
. Pour écrire
cela sous forme de chaîne simple, vous auriez besoin '\\\\\\1'
- et personne ne le veut.Utilisez repr () [1: -1]. Dans ce cas, les guillemets doubles n'ont pas besoin d'être échappés. La tranche [-1: 1] consiste à supprimer le guillemet 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 tel est le cas, procédez comme suit:
>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'
repr(x)[2:-1]
print(repr("I'm stuck")[1:-1])
imprime 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 souhaitez échapper un ensemble spécifique de caractères, 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\" :\
characters
il vaut mieux être le premier!
Si vous souhaitez uniquement remplacer certains caractères, vous pouvez utiliser ceci:
import re
print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")