2011-08-31 50 views
35

Tôi đọc trong một chuỗi từ hộp văn bản GUI do người dùng nhập và xử lý thông qua pandoc. Chuỗi chứa chỉ thị latex cho phép toán có ký tự gạch chéo ngược. Tôi muốn gửi trong chuỗi như là một chuỗi thô để pandoc để xử lý. Nhưng một cái gì đó như '\ theta' sẽ trở thành một tab và 'heta'.python: làm thế nào để chuyển đổi chuỗi chữ thành chuỗi ký tự nguyên?

Làm cách nào để chuyển đổi chuỗi ký tự có chứa ký tự dấu gạch chéo ngược thành chuỗi thô ...?

Chỉnh sửa:

Cảm ơn develerx, cừu bay và unutbu. Nhưng không có giải pháp nào có vẻ giúp tôi. Lý do là có các ký tự bị gạch chéo khác không có bất kỳ hiệu ứng nào trong python nhưng lại có ý nghĩa trong latex.

Ví dụ '\ lambda'. Tất cả các phương pháp được đề xuất sản xuất

\\lambda 

không được xử lý bằng cao su - nó sẽ vẫn là \ lambda.

Chỉnh sửa khác:

Nếu tôi có thể thực hiện công việc này, tôi nghĩ tôi nên thực hiện. @ Mark: Tất cả ba phương pháp đưa ra câu trả lời mà tôi không mong muốn.

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

Bạn có chắc chắn chuỗi thực sự chứa '\\ lambda' và không chỉ tăng gấp đôi lên khi bạn in nó? Thử in 'mystring [1:]' và xem liệu có còn '\' trong đó không. Nên có một số nhất quán - nếu '\ t' đang chuyển sang tab thì' \\ 'sẽ chuyển thành' \ '. –

+0

Bạn có thể đăng 'repr' của chuỗi như nhận được từ hộp văn bản GUI và hiển thị mã bạn đang sử dụng để xử lý thông qua pandoc không? – unutbu

+0

Thử nghiệm của bạn là không thực tế. Bạn không nhận được nó từ một hộp văn bản, bạn đang thiết lập nó với một chuỗi chữ, và Python đã chuyển đổi nó một cách không phù hợp bởi thời gian nó được gán cho 'a'. Không thể lấy lại văn bản gốc của bạn vào thời điểm đó. –

Trả lời

37

Chuỗi thô của Python chỉ là một cách để thông báo cho trình thông dịch Python rằng nó sẽ giải thích dấu gạch chéo ngược là dấu gạch chéo chữ. Nếu bạn đọc chuỗi được người dùng nhập, họ đã qua điểm mà họ có thể đã bị thô. Ngoài ra, đầu vào của người dùng có nhiều khả năng được đọc theo nghĩa đen, tức là "thô".

Điều này có nghĩa là diễn giải diễn ra ở một nơi khác. Nhưng nếu bạn biết rằng nó xảy ra, tại sao không thoát khỏi các dấu gạch chéo ngược cho bất cứ điều gì là giải thích nó?

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

(Lưu ý rằng bạn không thể làm r"\" như “a raw string cannot end in a single backslash”, nhưng tôi có thể đã sử dụng r"\\" cũng cho đối số thứ hai.)

Nếu điều đó không làm việc, đầu vào người dùng của bạn là dành cho một số lý do phức tạp giải thích các dấu gạch chéo ngược, vì vậy bạn sẽ cần một cách để bảo nó dừng lại.

+0

Đây là lần đầu tiên tôi thấy "chuỗi thô không thể kết thúc bằng một dấu gạch chéo ngược". Tôi đã không nhận ra phân tích chuỗi Python quá hacky - tôi nghĩ tiền tố 'r' có nghĩa là dừng xử lý các dấu gạch chéo ngược là đặc biệt, thay vào đó nó có nghĩa là xuất cả hai ký tự thay vì giải thích chúng. –

+0

@MarkRansom vâng, các chuỗi f cũng chỉ là xử lý sau chuỗi và không phải là một con subparser thực tế ... –

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

Điều này cho thấy có một dấu chéo ngược đơn trước khi n, lt:

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

Có gì đó sôi nổi đang xảy ra với giao diện đồ họa của bạn. Đây là một ví dụ đơn giản về việc lấy một số đầu vào của người dùng thông qua một Tkinter.Entry. Lưu ý rằng văn bản được truy xuất chỉ có một dấu gạch chéo ngược duy nhất trước n, lt.Vì vậy không có chế biến thêm nên cần thiế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() 

Nếu bạn gõ \nu + \lambda + \theta vào ô Entry sau cùng, giao diện điều khiển sẽ (chính xác) in:

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

Nếu GUI của bạn không được trả kết quả tương tự (như của bạn bài viết dường như đề xuất), sau đó tôi khuyên bạn nên xem xét khắc phục sự cố GUI, thay vì mucking xung quanh với string_escape và chuỗi replace.

+0

thật tuyệt nếu python giải thích chuỗi đó. nếu nó là pandoc, nó có thể không hoạt động. bạn có biết những gì (ngoài các dấu gạch chéo ngược) khác được thực hiện bởi 'string_escape'? có thể nó quá nhiều? –

+0

@flying sheep: Các tài liệu nói 'string_escape' [" tạo ra một chuỗi phù hợp như chuỗi chữ trong mã nguồn Python. "] (Http://docs.python.org/library/codecs.html). AFAIK, 'string_escape' ảnh hưởng đến các dấu gạch chéo ngược hoặc các ký tự bị gạch chéo và không có gì khác. Có lẽ tôi sai. Sẽ rất vui khi biết nếu nó làm được nhiều hơn. – unutbu

+0

tôi không biết nhiều hơn bạn. rất có thể bạn đã đúng. nhưng một lần nữa: nếu điểm giải thích xảy ra ăn một số lối thoát (chẳng hạn như '\ s' →' '), thì điều này sẽ tạo ra các lỗi im lặng. anh ta nên tìm nguồn. –

3

Khi bạn đọc chuỗi từ điều khiển GUI, nó đã là một chuỗi "thô". Nếu bạn in ra chuỗi, bạn có thể thấy các dấu gạch chéo ngược tăng gấp đôi, nhưng đó là một tạo phẩm về cách Python hiển thị chuỗi; trong nội bộ vẫn chỉ có một dấu gạch chéo ngược duy nhất.

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

Nếu bạn muốn chuyển đổi một chuỗi hiện có để chuỗi nguyên, sau đó chúng ta có thể phân công lại rằng như dưới đây

s1 = "welcome\tto\tPython"

raw_s1 = "%r"%s1

print(raw_s1)

Sẽ in

welcome\tto\tPython

+1

Tôi tin rằng, ít nhất là trong Python3, điều này thực sự sẽ in ra: 'welcome \\ tto \\ tPython' - Bao gồm các dấu nháy đơn. – disflux

+0

@ disflux Tôi vừa thử nghiệm nó bằng Python 3.3.6 và in: '' >>> s1 = "chào mừng \ tto \ tPython" >>> raw_s1 = "% r"% s1 >>> in (raw_s1) 'chào mừng \ tto \ tPython''' – user

Các vấn đề liên quan