Bir Python dizesindeki normal ifade özel karakterlerinden kaçış


126

Python'un normal ifadedeki özel karakterlerden kaçmak için kullanabileceğim bir işlevi var mı?

Örneğin I'm "stuck" :\olmalı I\'m \"stuck\" :\\.


2
Özel bir karakter olarak neyi düşünüyorsunuz?
pafcu

1
Tamamen bağlamınıza bağlıdır. Genellikle bu karakterler, onları bir dizenin içine aldığınızda tamamen iyidir.
dürtmek

Yanıtlar:


197

kullanım 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

Burada tekrar ediyorum:

re.escape (dize)

Tüm alfanümerik olmayan ters eğik çizgi ile dizeyi döndür; Bu, içinde normal ifade meta karakterleri olabilecek rastgele bir değişmez dizeyle eşleştirmek istiyorsanız kullanışlıdır.

Python 3.7'den itibaren re.escape(), yalnızca regex işlemleri için anlamlı olan karakterlerden kaçış için değiştirildi.


1
Re yerine regex modülünü kullanabilirsiniz. Örnek olarak regex.escape(pattern,string,special_only=True
Lokinou

17

Hiç kimsenin şu yolla normal ifadeler kullandığından bahsetmemesine şaşırdım 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\"

Dikkat edilmesi gereken önemli şeyler:

  • Gelen arama deseni içerir \aradığınız karakter (ler) yanı sıra. Sen kullanarak olacağız \kaçmak gerekir, böylece karakterleri kaçmayı o sıra.
  • Arama modelinin etrafına parantezler koyun , örneğin ([\"]), ikame modeli \önüne eklendiğinde bulunan karakteri kullanabilir . (İşte \1bu: ilk parantezli grubun değerini kullanır.)
  • rÖnünde r'([\"])'vasıtasıyla bir var çiğ dize . Ham dizeler ters eğik çizgiden kaçmak için farklı kurallar kullanır. ([\"])Düz bir dize olarak yazmak için , tüm ters eğik çizgileri ikiye katlamanız ve yazmanız gerekir '([\\"])'. Normal ifadeler yazarken ham dizeler daha dost canlısıdır.
  • In ikame desen, kaçmak gerekir \örneğin bir ikame grubu öncesinde ters eğik çizgi, ayırmak için \1dolayısıyla r'\\\1'. Bunu düz bir dizge olarak yazmak için ihtiyacınız olacak '\\\\\\1'- ve kimse bunu istemiyor.

9

Repr () [1: -1] kullanın. Bu durumda, çift tırnaklardan kaçınılmasına gerek yoktur. [-1: 1] dilimi, tek alıntıyı başından ve sonundan kaldırmaktır.

>>> x = raw_input()
I'm "stuck" :\
>>> print x
I'm "stuck" :\
>>> print repr(x)[1:-1]
I\'m "stuck" :\\

Ya da belki sadece programınıza yapıştırmak için bir ifadeden kaçmak istiyorsunuz? Eğer öyleyse, şunu yapın:

>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'

3
Dize unicode olup olmadığını u olacak ve çalışmalıdır çünkü, çalışmıyorrepr(x)[2:-1]
Antoine pelisse

Tüm dizelerin unicode olduğu python3.4'te, bu maalesef hiç işe yaramıyor gibi görünüyor. Bunun yerine print(repr("I'm stuck")[1:-1])baskılar I'm stuck.
dantiston

3

Yukarıda belirtildiği gibi, cevap durumunuza bağlıdır. Bir düzenli ifade için bir dizeden kaçış yapmak istiyorsanız, re.escape () kullanmalısınız. Ancak belirli bir karakter kümesinden çıkış yapmak istiyorsanız, bu lambda işlevini kullanın:

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

1

O kadar da zor değil:

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

3
Ters eğik çizgi bunlardan biriyse characters, ilk de olsa iyi olur!
steveha

0

Yalnızca bazı karakterleri değiştirmek istiyorsanız, bunu kullanabilirsiniz:

import re

print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.