2008-11-19 80 views
42

Tôi có một chuỗi chứa cả dấu ngoặc kép và dấu gạch chéo ngược mà tôi muốn đặt thành một biến trong Python. Tuy nhiên, bất cứ khi nào tôi cố gắng thiết lập nó, dấu ngoặc kép hoặc dấu gạch chéo bị loại bỏ hoặc thoát. Dưới đây là ví dụ:Trích dẫn các dấu gạch chéo ngược trong các chuỗi ký tự Python

>>> foo = 'baz "\"' 
>>> foo 
'baz ""' 

Vì vậy, thay vì baz "\" như tôi muốn tôi nhận được baz "". Nếu sau đó tôi cố gắng thoát khỏi dấu gạch chéo ngược, nó cũng không giúp được:

>>> foo = 'baz "\\"' 
>>> foo 
'baz "\\"' 

Bây giờ khớp với những gì tôi đưa vào nhưng không phải những gì tôi muốn ban đầu. Làm thế nào để bạn có được xung quanh vấn đề này?

Trả lời

61

Bạn đang bị đánh lừa bởi đầu ra - cách tiếp cận thứ hai bạn đang thực sự thực hiện những gì bạn muốn, bạn chỉ không tin vào điều đó. :)

>>> foo = 'baz "\\"' 
>>> foo 
'baz "\\"' 
>>> print foo 
baz "\" 

Ngẫu nhiên, có một hình thức chuỗi mà có thể là một chút rõ ràng hơn:

>>> print r'baz "\"' 
baz "\" 
20

Sử dụng một chuỗi nguyên:

>>> foo = r'baz "\"' 
>>> foo 
'baz "\\"' 

Lưu ý rằng mặc dù có vẻ sai, nó thực sự đúng. Chỉ có một dấu gạch chéo ngược trong chuỗi foo.

Điều này xảy ra vì khi bạn chỉ cần gõ foo tại dấu nhắc, python hiển thị kết quả của __repr__() trên chuỗi. Điều này dẫn đến sau (chú ý chỉ có một dấu chéo ngược và không có dấu ngoặc kép quanh chuỗi print ed):

>>> foo = r'baz "\"' 
>>> foo 
'baz "\\"' 
>>> print foo 
baz "\" 

Và chúng ta hãy tiếp tục đi vì có nhiều thủ đoạn xuyệc ngược. Nếu bạn muốn có dấu gạch chéo ngược ở cuối chuỗi và sử dụng phương pháp ở trên, bạn sẽ gặp phải sự cố:

>>> foo = r'baz \' 
    File "<stdin>", line 1 
    foo = r'baz \' 
       ^ 
SyntaxError: EOL while scanning single-quoted string 

Chuỗi thô không hoạt động đúng khi bạn làm điều đó. Bạn phải sử dụng chuỗi thông thường và thoát các dấu gạch chéo ngược của mình:

>>> foo = 'baz \\' 
>>> print foo 
baz \ 

Tuy nhiên, nếu bạn đang làm việc với tên tệp Windows, bạn đang ở trong một số cơn đau. Những gì bạn muốn làm là sử dụng dấu gạch chéo và os.path.normpath() chức năng:

myfile = os.path.normpath('c:/folder/subfolder/file.txt') 
open(myfile) 

Điều này sẽ tiết kiệm rất nhiều thoát và tóc rách. This page rất tiện lợi khi thực hiện điều này một lúc trước.

+1

Nếu bạn in như Charles Duffy đã làm ở trên, nó sẽ xuất hiện một cách chính xác. Khi bạn chỉ làm "foo", Python đang sử dụng hàm __repr __() để hiển thị chuỗi. Đó là đầu ra có thêm dấu gạch chéo ngược để khi bạn gán kết quả cho biến, nội dung sẽ giống nhau. –

+0

Điểm tuyệt vời, tôi đã cập nhật câu trả lời của mình để thêm "lý do". –

3

Những gì Harley nói, ngoại trừ điểm cuối cùng - không thực sự cần thiết để thay đổi '/' thành '\' trước khi gọi mở. Windows khá vui khi chấp nhận đường dẫn với dấu gạch chéo.

infile = open('c:/folder/subfolder/file.txt') 

Lần duy nhất mà bạn có khả năng cần chuỗi normpathed là nếu bạn đang đi qua để đến một chương trình khác thông qua vỏ (sử dụng os.system hoặc subprocess mô-đun).

-2

Cách khác để kết thúc chuỗi bằng dấu gạch chéo ngược là kết thúc chuỗi bằng dấu gạch chéo ngược, sau đó là khoảng trắng, sau đó gọi hàm .strip() trên chuỗi.

Tôi đã cố gắng để nối hai biến chuỗi và có họ cách nhau bởi một dấu chéo ngược, vì vậy tôi sử dụng như sau:

newString = string1 + "\ ".strip() + string2 
Các vấn đề liên quan