2011-08-31 2 views
35

Kullanıcı tarafından girilen bir GUI metin kutusundan bir dize okuyorum ve pandoc aracılığıyla işleyin. Dize, ters eğik çizgi karakterleri olan matematik için lateks yönergelerini içerir. Dizgeyi işlenmek üzere pandoc'a ham bir dize olarak göndermek istiyorum. Ama '\ theta' gibi bir şey bir sekme ve 'heta' olur.python: dize değişmezini ham dizgeye dönüştürme nasıl yapılır?

Ters eğik çizgi karakterleri içeren bir dize değişmezini işlenmemiş bir dizeye nasıl dönüştürebilirim?

Düzenleme:

Teşekkür develerx, uçan koyun ve unutbu. Ama çözümlerin hiçbiri bana yardım etmiyor gibi görünüyor. Bunun nedeni, python'da herhangi bir etkisi olmayan fakat latekste bir anlamı olan başka ters eğik çizgi karakterleri olmasıdır.

Örneğin '\ lambda'. o \ lambda olarak kalmalıdır - Bütün yöntemler lateks işlemede geçmez üretmek

\\lambda 

önerdi.

başka düzenleme: ben bu işi sağlayabilirseniz

, ben üzerinden olması gerektiğini düşünüyorum. @Mark: Her üç yöntem de istemediğim cevapları veriyor.

a='\nu + \lambda + \theta'; 
b=a.replace(r"\\",r"\\\\"); 
c='%r' %a; 
d=a.encode('string_escape'); 
print a 

u + \lambda + heta 
print b 

u + \lambda + heta 
print c 
'\nu + \\lambda + \theta' 
print d 
\nu + \\lambda + \theta 
+0

size dize gerçekten \\ 'lambda' içerir ve bunu yazdırırken sadece iki katına olmadığından emin misiniz baskı olacak mı? 'Mystring [1:]' i basmayı deneyin ve hala içinde bir '\' olup olmadığını görün. Bir miktar tutarlılık olmalı - eğer '\ t' sekmeye dönüyorsa o zaman '' '' '' ''' –

+0

Dizenin 'repr 'ifadesini GUI metin kutusundan alınabilir ve pandoc üzerinden işlemek için kullandığınız kodu gösterebilir misiniz? – unutbu

+0

Testiniz gerçekçi değil. Bunu bir metin kutusundan alamıyorsunuz, onu bir dizgi ile ayarlıyorsunuz, ve Python zaten a'ya atandığı zaman tutarsız bir şekilde onu dönüştürdü. Orijinal metninizi bu noktada geri almak imkansızdır. –

cevap

37

Python'un ham dizeleri o edebi eğik çizgiler olarak ters eğik çizgi yorumlamak gerektiğini Python yorumlayıcısı anlatmak için sadece bir yoludur. Kullanıcı tarafından girilen dizeleri okursanız, zaten ham olabilecekleri noktayı geçmişlerdir. Ayrıca, kullanıcı girdisi büyük ihtimalle tam anlamıyla, yani "ham" olarak okunur.

Bu, tercüme işleminin başka bir yerde gerçekleştiği anlamına gelir. Ama eğer bunun olduğunu biliyorsan, niçin onu çeviriyorsa, ters bölülerden kaçmasın?

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

(Eğer “a raw string cannot end in a single backslash” olarak r"\" yapamaz unutmayın ama ikinci argüman yanı r"\\" kullanılmış olabilir.)

Bu işe yaramazsa, kullanıcı girişi bazı içindir ters eğik çizgileri yorumlamak için arcane nedeni, bu yüzden bunu durdurmak için söylemek için bir yol gerekir.

+0

Bu, "ham dizinin tek bir ters eğik çizgi içinde bitemediğini" ilk defa görüntüledim. Python dizgisini ayrıştırma işleminin bu kadar zor olduğunu fark etmemiştim - rd öneki, ters eğik çizgileri özel olarak işlemeyi durdurmak anlamına geliyordu, bunun yerine onları yorumlamak yerine her iki karakterin çıktısını almak anlamına geliyordu. –

+0

@MarkRansom evet, f dizeleri de sadece dize postprocessing ve gerçek subparser değil… –

4
a='\nu + \lambda + \theta' 
d=a.encode('string_escape').replace('\\\\','\\') 
print(d) 
# \nu + \lambda + \theta 

Bu n, l ve t önce tek ters eğik çizgi olduğunu gösteriyor: GUI'nizin oluyor korkak şey

print(list(d)) 
# ['\\', 'n', 'u', ' ', '+', ' ', '\\', 'l', 'a', 'm', 'b', 'd', 'a', ' ', '+', ' ', '\\', 't', 'h', 'e', 't', 'a'] 

yoktur. İşte bir kullanıcı girdisini Tkinter.Entry aracılığıyla yakalamanın basit bir örneği. Alınan metnin yalnızca n, l ve t'dan önce tek bir ters eğik çizgiye sahip olduğuna dikkat edin.Böylece hiçbir ekstra işlem gerekli olmalıdır:

import Tkinter as tk 

def callback(): 
    print(list(text.get())) 

root = tk.Tk() 
root.config() 

b = tk.Button(root, text="get", width=10, command=callback) 

text=tk.StringVar() 

entry = tk.Entry(root,textvariable=text) 
b.pack(padx=5, pady=5) 
entry.pack(padx=5, pady=5) 
root.mainloop() 

Eğer giriş kutuya, konsol olacak (doğru) print \nu + \lambda + \theta yazarsanız: GUI benzer sonuçlar dönen değilse olarak (

['\\', 'n', 'u', ' ', '+', ' ', '\\', 'l', 'a', 'm', 'b', 'd', 'a', ' ', '+', ' ', '\\', 't', 'h', 'e', 't', 'a'] 

senin post önermek gibi görünüyor), o zaman ben string_escape ve replace dize ile uğraşmak yerine GUI sorununun düzeltilmesi içine bakarak tavsiye ederim.

+0

dize yorumlar python ise güzel. eğer pandoksa, işe yaramayabilir. string_escape' tarafından başka ne yapılır (ters eğik çizgi dışında)? belki çok mu fazla? –

+0

@flying sheep: Dokümanlar dize_escape ["Python kaynak kodunda dize değişmezi olarak uygun bir dizgi üretir." (Http://docs.python.org/library/codecs.html). AFAIK, string_escape, ters eğik çizgi veya ters eğik karakterler ve başka hiçbir şeyi etkilemez. Belki yanılıyorum. Daha fazlasını yapıp yapmadığını öğrenmek için mutlu olurdum. – unutbu

+0

Senden daha fazla şey bilmiyorum. büyük olasılıkla haklısınız. ama yine: eğer yorumlamanın yapıldığı nokta bazı kaçışlar çıkarsa ('\ s' → '' gibi), bu da sessiz hatalara neden olur. Kaynağı bulmalı. –

3

Dizeyi GUI denetiminden okuduğunuzda, bu zaten bir "ham" dizgidir. Dizgiyi yazdırırsanız, ters eğik çizgileri ikiye katlandığını görebilirsiniz, ancak bu Python'un dizeleri nasıl görüntülediğinin bir ürünüdür; dahili olarak hala sadece bir ters eğik çizgi var.

>>> a='\nu + \lambda + \theta' 
>>> a 
'\nu + \\lambda + \theta' 
>>> len(a) 
20 
>>> b=r'\nu + \lambda + \theta' 
>>> b 
'\\nu + \\lambda + \\theta' 
>>> len(b) 
22 
>>> b[0] 
'\\' 
>>> print b 
\nu + \lambda + \theta 
0
import re 

matches = [] 
var = 'Hello, how are you?' 

search_term = 'how are' 


if re.search('\\b'+search_term+'\\b', var): 
    matches.append(search_term) 
    print matches 

else: 
    print 'false' 
6

ham dizesine varolan dize dönüştürmek istiyorsanız, o zaman aşağıda

s1 = "welcome\tto\tPython"

raw_s1 = "%r"%s1

print(raw_s1)

0 gibi olduğunu yeniden atayabilirsiniz

welcome\tto\tPython

+1

En azından Python3'te inanıyorum ki, bu gerçekten basacaktır: 'welcome \\ tto \\ tPython' - Tek tırnak dahil. – disflux

+0

@disflux Sadece Python 3.3.6 ile test ettim ve basıldı: '' >>> s1 = "welcome \ tto \ tPython" >>> raw_s1 = "% r"% s1 >>> print (raw_s1) 'welcome \ tto \ tPython' – user