...'
,"..."
Python’da, bu dize değişmezlerini aşağıdaki karakterlerden biriyle önek yaparsanız, değer, kaçış dizisini genişletmeden bir dize haline gelir.
r
R
Windows yolları ve düzenli ifade kalıpları gibi çok sayıda ters eğik çizgi kullanan dizelerle uğraşırken kullanışlıdır.
Aşağıdaki bilgiler burada verilmiştir.
- kaçış dizisi
- Ham dizelerdeki kaçış dizilerini yoksay (devre dışı bırak)
- Normal dizeyi ham dizeye dönüştürün:
repr()
- Sondaki ters eğik çizgiye dikkat edin.
kaçış dizisi
Python’da, normal bir dizgede temsil edilemeyen karakterler (sekmeler ve yeni satırlar gibi), C diline benzer şekilde ters eğik çizgili kaçış dizileri kullanılarak tanımlanır. Aşağıda bir kaçış dizisi örneği gösterilmektedir.
\t
\n
s = 'a\tb\nA\tB'
print(s)
# a b
# A B
Ham dizelerdeki kaçış dizilerini yoksay (devre dışı bırak)
...'
,"..."
Böyle bir dize değişmezini aşağıdakilerden biriyle ön eklerseniz, değer, kaçış dizisini genişletmeden bir dize haline gelir. Böyle bir diziye ham dizi denir.
r
R
rs = r'a\tb\nA\tB'
print(rs)
# a\tb\nA\tB
Ham dize türü olarak adlandırılan özel bir tür yoktur, yalnızca bir dize türüdür ve aşağıdaki gibi ters eğik çizgi ile temsil edilen normal bir dizeye eşittir.\\
print(type(rs))
# <class 'str'>
print(rs == 'a\\tb\\nA\\tB')
# True
Normal bir dizede, bir kaçış dizisi bir karakter olarak kabul edilir, ancak ham bir dizede ters eğik çizgiler de karakter olarak sayılır. Dizenin uzunluğu ve her karakter aşağıdaki gibidir.
print(len(s))
# 7
print(list(s))
# ['a', '\t', 'b', '\n', 'A', '\t', 'B']
print(len(rs))
# 10
print(list(rs))
# ['a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B']
Windows Yolu
Bir Windows yolunu bir dize olarak göstermek istediğinizde ham dizeyi kullanmak yararlıdır.
Windows yolları ters eğik çizgi ile ayrılmıştır, yani normal bir string kullanırsanız yoldan aşağıdaki gibi kaçmanız gerekir fakat eğer ham string kullanırsanız onu olduğu gibi yazabilirsiniz. Değerler eşdeğerdir.\\
path = 'C:\\Windows\\system32\\cmd.exe'
rpath = r'C:\Windows\system32\cmd.exe'
print(path == rpath)
# True
Tek sayıda ters eğik çizgi ile biten bir dizenin aşağıda açıklandığı gibi bir hatayla sonuçlanacağını unutmayın. Bu durumda dizeyi normal bir dize olarak yazmak veya dizenin sadece sonunu normal bir dize olarak yazarak birleştirmek gerekir.
path2 = 'C:\\Windows\\system32\\'
# rpath2 = r'C:\Windows\system32\'
# SyntaxError: EOL while scanning string literal
rpath2 = r'C:\Windows\system32' + '\\'
print(path2 == rpath2)
# True
repr() ile normal dizeleri ham dizelere dönüştürün
Normal bir dizgiyi, kaçış dizilerini yok sayarak (devre dışı bırakarak) bir ham dizgeye dönüştürmek istiyorsanız, yerleşik repr() işlevini kullanabilirsiniz.
s_r = repr(s)
print(s_r)
# 'a\tb\nA\tB'
repr()’nin döndürdüğü şey, bir nesneyi temsil eden bir dizedir, öyle ki, başta ve sondaki karakterlerle eval()’e geçirildiği zamankiyle aynı değere sahiptir.
print(list(s_r))
# ["'", 'a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B', "'"]
Dilimleri kullanarak, r eklenmiş ham dizeye eşdeğer bir dize elde edebiliriz.
s_r2 = repr(s)[1:-1]
print(s_r2)
# a\tb\nA\tB
print(s_r2 == rs)
# True
print(r'\t' == repr('\t')[1:-1])
# True
Sondaki ters eğik çizgiye dikkat edin.
Ters eğik çizgi, hemen ardından gelen alıntı karakterinden kaçtığından, dizenin sonunda tek sayıda ters eğik çizgi varsa bir hata oluşur. Çift sayıda ters eğik çizgi sorun değil.
# print(r'\')
# SyntaxError: EOL while scanning string literal
print(r'\\')
# \\
# print(r'\\\')
# SyntaxError: EOL while scanning string literal