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\" :\\
.
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\" :\\
.
Yanıtlar:
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.
regex.escape(pattern,string,special_only=True
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:
\
aradığınız karakter (ler) yanı sıra. Sen kullanarak olacağız \
kaçmak gerekir, böylece karakterleri kaçmayı
o sıra.([\"])
, ikame
modeli \
önüne eklendiğinde bulunan karakteri kullanabilir . (İşte
\1
bu: 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.\
örneğin bir ikame grubu öncesinde ters eğik çizgi, ayırmak için \1
dolayısıyla r'\\\1'
. Bunu düz bir dizge olarak yazmak
için ihtiyacınız olacak '\\\\\\1'
- ve kimse bunu istemiyor.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" :\\'
repr(x)[2:-1]
print(repr("I'm stuck")[1:-1])
baskılar I'm stuck
.
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\" :\\
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\" :\
characters
, ilk de olsa iyi olur!
Yalnızca bazı karakterleri değiştirmek istiyorsanız, bunu kullanabilirsiniz:
import re
print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")