Soru Tüm alıntıları bir dizede kaçan tırnak işaretleri ile değiştirilsin mi?


Python'da bir dize verilir, örneğin:

s = 'This sentence has some "quotes" in it\n'

Bu dizgenin yeni bir kopyasını oluşturmak istedim. (Javascript'te daha fazla kullanım için). Yani, örneğin, istediğim bunu üretmek:

'This sentence has some \"quotes\" in it\n'

Kullanmayı denedim replace(), gibi:

s.replace('"', '\"')

ama bu aynı dizgeyi döndürür. Sonra bunu denedim:

s.replace('"', '\\"')

Ancak bu, çift çıkışlı teklifleri döndürür, örneğin:

'This sentence has some \\"quotes\\" in it.\n'

Nasıl değiştirilir " ile \"?

GÜNCELLEŞTİRME:

Hem alıntıları hem de yeni satırları kaçış olarak gösteren bu kopyalanabilir metinden çıktıya ihtiyacım var. Başka bir deyişle, kopyalamak istiyorum:

'This sentence has some \"quotes\" in it.\n'

Ham string kullanırsam ve print sonuç doğru kaçtı alıntı aldım, ancak kaçtı yeni satır yazdırmaz. Eğer kullanmazsam print sonra yeni satırlarımı ancak çift çıkışlı tırnaklarımı alıyorum. Hem yeni satır hem de teklif kaçışını gösteren bir kopyasını nasıl oluşturabilirim?


25
2017-09-19 05:09


Menşei


Bir şey kaçırıyor olabilirim, ama senin ikinci s.replace() İlk ile aynı gibi görünüyor. - Steven Liao
thx, yazım hatası - mix
Son değiştirmenin doğru. Deneyin printdize ve ne olduğunu görmek - inspectorG4dget
Gayet eminim 'This sentence has some "quotes" in it\n' geçerli bir Javascript dizesidir. - user2357112
Sadece teklifleri değiştirmek istediğinizden emin misiniz? Ters eğik çizgi, backspaces ve diğer her türlü garip boktan genellikle kaçmak gerekir. repr(s) Sonuçta her zaman geçerli Javascript olup olmadığını bilmiyorum rağmen, çok daha fazla şey yakalar; kesinlikle unicode dizeleri için değil. json da bakmaya değer olabilir. - user2357112


Cevaplar:


Merhaba genellikle Javascript ile çalışırken Python tarafından sağlanan json modülünü kullanırım. Kullanıcı2357112'nin işaret ettiği gibi bir dizi başka şeyden de diziden kurtulacaktır.

import json
string = 'This sentence has some "quotes" in it\n'
json.dumps(string) #gives you '"This sentence has some \\"quotes\\" in it\\n"'

29
2017-09-19 05:33



Bu güzel ve neredeyse benim için çalışıyor, ama tek tırnaklardan kaçmıyor. Onları kendim değiştirebilirim, ama bunu zaten yapmadığı için garip buluyorum. - mix
json.dumps()Tek tırnaklardan kaçmak zorunda değil çünkü jsonda özel bir anlamı yok. Unutmayın, json sadece JavaScript'in bir alt kümesidir. json.org - ʇsәɹoɈ
@mix Çift tırnaklı bir dizgenin içinde kalıyorsa tek tırnaklardan kaçmanız gerekmez. Javascript tek tırnaklı dizeleri desteklerken, JSON'daki tüm dizeler çift tırnaklıdır. json.dumps çift ​​tırnak içinde tüm dizeleri çıktı olarak tek tırnaklardan kaçmaya gerek yoktur. - Anentropic


İkinci teşebbüsün doğru, ama aradaki farkla kafan karışıyor. repr ve str bir dizenin İkinci yolunuzu yapmak için daha aptalca bir yol "ham dizeleri" kullanmaktır:

>>> s = 'This sentence has some "quotes" in it\n'
>>> print s
This sentence has some "quotes" in it

>>> print s.replace('"', r'\"')  # raw string used here
This sentence has some \"quotes\" in it

>>> s.replace('"', r'\"')
'This sentence has some \\"quotes\\" in it\n'

Ham dizgiler WYSIWYG'dir: ham dizgede ters eğik çizgi sadece başka bir karakterdir. Bu, keşfettiğiniz gibi, aksi halde karıştırılmaması kolay ;-)

Dizgiyi (yukarıda belirtilen 2. son çıktı) basmak, şimdi istediğiniz karakterleri içerdiğini gösterir.

olmadan print (yukarıdaki son çıktı), Python dolaylı olarak uygulanır. repr() görüntülemeden önce değere. Sonuç, Python'un değerlendirmesi için orijinali üretecek bir dizedir. Bu yüzden, son satırda geri tepmeler iki katına çıkar. Onlar dizide değiller ama Python her birini değerlendirecek olsaydı ihtiyaç duyuyorlardı. \\ biri olur \ Sonuçta.


18
2017-09-19 05:20



Kaçak alıntılarla görünmek için dizgeye ihtiyacım var ama aynı zamanda kaçtı yeni satır. IOW, kopabilir çıktıların nasıl görünmesini istiyorum: 'This sentence has some \"quotes\" in it.\n'. Ham dizeyi kullanırsam ve sonucu yazdıysam doğru şekilde kaçtılan alıntıyı alırsam, ancak kaçan yeni satır yazdırmaz. Eğer kullanmazsam print sonra yeni satırlarımı ancak çift çıkışlı tırnaklarımı alıyorum. - mix
Öyleyse sadece başka bir değişiklik yapmalısınız, .replace("\n", r"\n"). Bu, yeni karakter karakterini iki karakter ters eğik çizgi ve n harfi ile değiştirir. Eğer kaçması gereken başka şeyler varsa, bu yaklaşım sıkıcı olur ;-) - Tim Peters


Son denemeniz beklediğin gibi çalışıyordu. Gördüğünüz çift ters eğik çizgi, aslında dizede bulunan tek ters eğik çizgileri görüntülemenin bir yoludur. İle sonucun uzunluğunu kontrol ederek bunu doğrulayabilirsiniz. len().

Çift ters eğik çizgi ile ilgili ayrıntılar için, bakınız: __repr__()


GÜNCELLEŞTİRME:

Düzenlenen soruya cevaben, bunlardan birine ne dersin?

print repr(s).replace('"', '\\"')
print s.encode('string-escape').replace('"', '\\"')

Ya da python 3 için:

print(s.encode('unicode-escape').replace(b'"', b'\\"'))

5
2017-09-19 05:14