2011-08-31 12 views
35

मैंने उपयोगकर्ता द्वारा दर्ज किए गए एक जीयूआई टेक्स्टबॉक्स से एक स्ट्रिंग में पढ़ा है और इसे pandoc के माध्यम से संसाधित किया है। स्ट्रिंग में गणित के लिए लेटेक्स निर्देश होते हैं जिनमें बैकस्लैश वर्ण होते हैं। मैं प्रसंस्करण के लिए स्ट्रैंड में कच्ची स्ट्रिंग के रूप में स्ट्रिंग में भेजना चाहता हूं। लेकिन '\ theta' जैसे कुछ एक टैब और 'हेटा' बन जाता है।पायथन: स्ट्रिंग शाब्दिक से कच्चे स्ट्रिंग को शाब्दिक रूपांतरित करने के लिए कैसे?

मैं एक स्ट्रिंग अक्षर को कैसे परिवर्तित कर सकता हूं जिसमें कच्चे स्ट्रिंग में बैकस्लैश वर्ण शामिल हैं ...?

संपादित करें:

धन्यवाद develerx, उड़ान भेड़ और unutbu। लेकिन कोई भी समाधान मेरी मदद करने लगता है। इसका कारण यह है कि अन्य बैकस्लेश-वर्ण हैं जिनके पास अजगर में कोई प्रभाव नहीं पड़ता है लेकिन लेटेक्स में इसका अर्थ है।

उदाहरण के लिए '\ lambda'। सुझाव दिया गया है कि सभी विधियों का उत्पादन

\\lambda 

जो लेटेक्स प्रसंस्करण में नहीं जाता है - यह \ lambda के रूप में रहना चाहिए।

एक और संपादित करें:

मैं इस काम मिल सकता है, मैं मैं के माध्यम से किया जाना चाहिए लगता है। @ मार्क: सभी तीन विधियां उत्तर देती हैं जिन्हें मैं नहीं चाहता हूं।

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

क्या आप वाकई स्ट्रिंग वास्तव में 'शामिल \\ lambda' और अभी दोहरीकरण नहीं है जब आप इसे प्रिंट कर रहे हैं? 'Mystring [1:]' प्रिंट करने का प्रयास करें और देखें कि इसमें अभी भी '\' है या नहीं। कुछ स्थिरता होनी चाहिए - यदि '\ t' टैब में कनवर्ट हो रहा है तो' \\ 'को' \ 'में परिवर्तित करना चाहिए। –

+0

क्या आप GUI टेक्स्टबॉक्स से प्राप्त स्ट्रिंग के 'repr' को पोस्ट कर सकते हैं, और उस कोड को दिखा सकते हैं जिसका उपयोग आप इसे पैंडोक के माध्यम से संसाधित करने के लिए कर रहे हैं? – unutbu

+0

आपका परीक्षण अवास्तविक है। आप इसे टेक्स्टबॉक्स से नहीं प्राप्त कर रहे हैं, आप इसे एक स्ट्रिंग अक्षर के साथ सेट कर रहे हैं, और पाइथन ने इसे पहले से ही 'ए' को असाइन किए जाने तक असंगत रूप से परिवर्तित कर दिया है। उस बिंदु पर अपना मूल पाठ वापस लेना असंभव है। –

उत्तर

37

पायथन के कच्चे तार सिर्फ एक तरह से अजगर दुभाषिया है कि यह शाब्दिक स्लैश के रूप में बैकस्लैश से समझना चाहिए बताने के लिए कर रहे हैं। यदि आप उपयोगकर्ता द्वारा दर्ज तारों को पढ़ते हैं, तो वे पहले से ही उस बिंदु से पहले हैं जहां वे कच्चे हो सकते थे। इसके अलावा, उपयोगकर्ता इनपुट सबसे अधिक संभवतः सचमुच पढ़ा जाता है, यानी "कच्चा"।

इसका मतलब है कि व्याख्या कहीं और होती है। लेकिन अगर आप जानते हैं कि ऐसा होता है, तो जो भी व्याख्या कर रहा है उसके लिए बैकस्लाश से बचें क्यों नहीं?

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

(ध्यान दें कि आप “a raw string cannot end in a single backslash” रूप r"\" ऐसा नहीं कर सकते, लेकिन मैं दूसरा तर्क के लिए r"\\" इस्तेमाल किया जा सकता था और साथ ही।)

यदि वह काम नहीं करता है, अपने उपयोगकर्ता इनपुट कुछ के लिए है बैकस्लेश की व्याख्या करने के लिए आर्केन कारण, इसलिए आपको इसे रोकने के लिए इसे बताने के लिए एक तरीका चाहिए।

+0

यह पहली बार है जब मैंने देखा है "कच्ची स्ट्रिंग एक बैकस्लैश में समाप्त नहीं हो सकती"। मुझे एहसास नहीं हुआ था कि पाइथन स्ट्रिंग पार्सिंग इतनी हैकी थी - मैंने सोचा था कि 'आर' उपसर्ग का मतलब बैकस्लाश को विशेष रूप से इलाज करना बंद करना है, इसके बजाय इसका मतलब है कि उन्हें वर्णित करने के बजाय दोनों वर्णों को आउटपुट करना है। –

+0

@MarkRansom हाँ, एफ-स्ट्रिंग्स भी स्ट्रिंग पोस्टप्रोसेसिंग हैं और एक वास्तविक उपपरक्षक नहीं हैं ... –

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

इससे पता चलता है इससे पहले कि n, l और t एक भी बैकस्लैश है कि वहाँ:

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

फंकी कुछ अपने जीयूआई के साथ चल रहा है। Tkinter.Entry के माध्यम से कुछ उपयोगकर्ता इनपुट को पकड़ने का एक सरल उदाहरण यहां दिया गया है। ध्यान दें कि पाठ पुनर्प्राप्त केवल n, l, और t से पहले एक बैकस्लैश है।इस प्रकार बिना किसी अतिरिक्त संसाधन आवश्यक होना चाहिए:

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() 

आप एंट्री बॉक्स में \nu + \lambda + \theta लिखते हैं, तो सांत्वना होगा (सही) प्रिंट:

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

अपने जीयूआई इसी तरह के परिणाम नहीं लौटा रहा है तो (के रूप में अपने पोस्ट सुझाव देने लगता है), तो मैं string_escape और स्ट्रिंग replace के साथ घूमने की बजाय, GUI समस्या को ठीक करने की सलाह देना चाहूंगा।

+0

यह अच्छा है अगर यह स्ट्रिंग का अर्थ है जो पाइथन है। अगर यह पांडोक है, तो यह काम नहीं कर सकता है। क्या आप जानते हैं कि (backslashes के अलावा) 'string_escape' द्वारा किया जाता है? शायद यह बहुत ज्यादा करता है? –

+0

@flying भेड़: दस्तावेज़ कहते हैं 'string_escape' ["एक स्ट्रिंग उत्पन्न करता है जो पायथन स्रोत कोड में स्ट्रिंग अक्षर के रूप में उपयुक्त है।"] (Http://docs.python.org/library/codecs.html)। AFAIK, 'string_escape' बैकस्लाश या बैकस्लेश वर्णों को प्रभावित करता है और कुछ भी नहीं। शायद मैं गलत हूँ। सीखने में खुशी होगी कि यह और अधिक करता है या नहीं। – unutbu

+0

मैं आपसे अधिक नहीं जानता। सबसे अधिक संभावना है कि आप सही हैं। लेकिन फिर: यदि वह बिंदु जहां व्याख्या होती है तो कुछ बच निकलता है (जैसे '\ s' →' '), तो यह चुप त्रुटियों को उत्पन्न करेगा। उसे स्रोत मिलना चाहिए। –

3

जब आप जीयूआई नियंत्रण से स्ट्रिंग पढ़ते हैं, तो यह पहले से ही "कच्ची" स्ट्रिंग है। यदि आप स्ट्रिंग को प्रिंट करते हैं तो आप बैकस्लाश को दोगुना कर सकते हैं, लेकिन यह एक आर्टिफैक्ट है कि पाइथन स्ट्रिंग को कैसे प्रदर्शित करता है; आंतरिक रूप से अभी भी केवल एक बैकस्लैश है।

>>> 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

आप कच्चे स्ट्रिंग के लिए एक मौजूदा स्ट्रिंग परिवर्तित करना चाहते हैं, तो हम पुन: असाइन कर सकते हैं कि नीचे

s1 = "welcome\tto\tPython"

raw_s1 = "%r"%s1

print(raw_s1)

0 की तरह

प्रिंट होगा

welcome\tto\tPython

+1

मेरा मानना ​​है कि कम से कम पायथन 3 में, यह वास्तव में प्रिंट करेगा: 'स्वागत \\ tto \\ tPython' - एकल उद्धरण सहित। – disflux

+0

@disflux मैंने अभी इसे पायथन 3.3.6 के साथ परीक्षण किया है और मुद्रित में: ''>> s1 =" स्वागत \ tto \ tPython " >>> raw_s1 ="% r "% s1 >>> प्रिंट (raw_s1) 'स्वागत \ tto \ tPython''' – user

संबंधित मुद्दे