Hướng dẫn python string keep escape characters - chuỗi python giữ ký tự thoát

unicode_escape nói chung không hoạt động

Nó chỉ ra rằng giải pháp ____10 hoặc unicode_escape không hoạt động nói chung - đặc biệt, nó không hoạt động với sự hiện diện của unicode thực tế.

Nếu bạn có thể chắc chắn rằng mọi nhân vật không phải ASCII sẽ bị thoát ra (và hãy nhớ, bất cứ điều gì ngoài 128 ký tự đầu tiên là không phải ASCII), unicode_escape sẽ làm điều đúng đắn cho bạn. Nhưng nếu có bất kỳ ký tự không phải là ASCII nào đã có trong chuỗi của bạn, mọi thứ sẽ sai.

unicode_escape về cơ bản được thiết kế để chuyển đổi byte thành văn bản Unicode. Nhưng ở nhiều nơi - ví dụ, mã nguồn Python - dữ liệu nguồn đã là văn bản Unicode.

Cách duy nhất này có thể hoạt động chính xác là nếu bạn mã hóa văn bản thành byte trước. UTF-8 là mã hóa hợp lý cho tất cả các văn bản, vì vậy điều đó sẽ hoạt động, phải không?

Các ví dụ sau đây là trong Python 3, do đó các chuỗi chữ sẽ sạch hơn, nhưng cùng một vấn đề tồn tại với các biểu hiện hơi khác nhau trên cả Python 2 và 3.

>>> s = 'naïve \\t test'
>>> print(s.encode('utf-8').decode('unicode_escape'))
naïve   test

Vâng, điều đó là sai.

Cách mới được đề xuất để sử dụng codec giải mã văn bản thành văn bản là gọi trực tiếp

>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve   test
4. cái đó có giúp ích không?

>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve   test

Không có gì. (Ngoài ra, ở trên là unicodeerror trên Python 2.)

Codec unicode_escape, mặc dù tên của nó, hóa ra cho rằng tất cả các byte không ASCII đều thuộc mã hóa Latin-1 (ISO-8859-1). Vì vậy, bạn sẽ phải làm điều đó như thế này:

>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test

Nhưng điều đó thật khủng khiếp. Điều này giới hạn bạn đối với 256 ký tự Latin-1, như thể Unicode chưa bao giờ được phát minh ra!

>>> print('Ernő \\t Rubik'.encode('latin-1').decode('unicode_escape'))
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range(256)

Thêm một biểu thức chính quy để giải quyết vấn đề

(Đáng ngạc nhiên, bây giờ chúng tôi không có hai vấn đề.)

Những gì chúng ta cần làm chỉ là áp dụng bộ giải mã unicode_escape cho những thứ mà chúng ta chắc chắn là văn bản ASCII. Cụ thể, chúng tôi có thể đảm bảo chỉ áp dụng nó cho các chuỗi thoát Python hợp lệ, được đảm bảo là văn bản ASCII.

Kế hoạch là, chúng tôi sẽ tìm thấy các chuỗi thoát bằng cách sử dụng biểu thức thông thường và sử dụng hàm làm đối số cho

>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve   test
7 để thay thế chúng bằng giá trị không được phân loại của chúng.

import re
import codecs

ESCAPE_SEQUENCE_RE = re.compile(r'''
    ( \\U........      # 8-digit hex escapes
    | \\u....          # 4-digit hex escapes
    | \\x..            # 2-digit hex escapes
    | \\[0-7]{1,3}     # Octal escapes
    | \\N\{[^}]+\}     # Unicode characters by name
    | \\[\\'"abfnrtv]  # Single-character escapes
    )''', re.UNICODE | re.VERBOSE)

def decode_escapes(s):
    def decode_match(match):
        return codecs.decode(match.group(0), 'unicode-escape')

    return ESCAPE_SEQUENCE_RE.sub(decode_match, s)

Và với điều đó:

>>> print(decode_escapes('Ernő \\t Rubik'))
Ernő     Rubik

Trình tự thoát là sự kết hợp của các ký tự (thường có tiền tố với ký tự thoát), có cách giải thích ký tự không theo chữ. Do đó, các chuỗi ký tự được coi là một chuỗi thoát có một ý nghĩa khác với các ký tự theo nghĩa đen có trong đó. Hầu hết các ngôn ngữ lập trình sử dụng dấu gạch chéo ngược \ làm nhân vật thoát. Nhân vật này được sử dụng như một trình khởi tạo trình tự thoát, bất kỳ ký tự nào (một hoặc nhiều) sau đây được hiểu là một chuỗi thoát. Nếu một chuỗi thoát được chỉ định cho một ký tự không thể in hoặc mã điều khiển, thì chuỗi được gọi là ký tự điều khiển. & NBSP;

Danh sách trình tự thoát trong Python:

Nhân vật thoátNghĩa
\Trích dẫn duy nhất
\ ”Báo giá kép
\\dấu vết chéo ngược
\ n & nbsp;Dòng mới
\ rVận chuyển trở lại
\ tTab ngang
\ bBackspace
\ fthức ăn dạng
\ vTab dọc
\ 0Nhân vật null
\ N {name}Cơ sở dữ liệu ký tự Unicode có tên Tra cứu
\ uxxxxxxxxxKý tự unicode với giá trị hex 16 bit xxxx
\ UxxxxxxxxxKý tự unicode với giá trị hex 32 bit xxxxxxxx
\ oooNhân vật có giá trị bát phân ooo
\ XHHNhân vật có giá trị hex hh

Bảng trên được áp dụng cho ngôn ngữ lập trình Python, vì các ngôn ngữ khác nhau có các chuỗi điều khiển và ký tự điều khiển khác nhau để bảng trên có thể không hoạt động trong ngôn ngữ lập trình của bạn. Bán tại. Trình thông dịch dòng lệnh Windows sử dụng một Caret ( ^) để thoát khỏi các ký tự, và do đó, bảng trên won được áp dụng ở đó.^ ) to escape characters, and therefore the above table won’t be applicable there.

Thoát giải thích trình tự

Giải thích trình tự thoát được thực hiện, khi gặp dấu gạch chéo ngược trong một chuỗi. Sau cuộc gặp gỡ của một dấu gạch chéo ngược (bên trong một chuỗi), bất kỳ ký tự sau (với (\)) sẽ được xem trên bảng đã nói ở trên. Nếu một trận đấu được tìm thấy thì chuỗi được bỏ qua từ chuỗi và bản dịch của nó được liên kết với chuỗi được sử dụng. Nếu không tìm thấy một trận đấu, thì không có tra cứu nào xảy ra và trình tự điều khiển được sao chép như nó là. & NBSP;\ )) would be looked upon the aforementioned table. If a match is found then the sequence is omitted from the string, and its translation associated with the sequence is used. If a match is not found, then no lookup happens, and the control sequence is copied as it is. 

Thí dụ

Python3

>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve   test
8
>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve   test
9
>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test
0
>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test
1

>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve   test
8
>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve   test
9
>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test
4
>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test
1

Output:

I will go    Home
See you\jtommorow

Như đã thấy trong đầu ra ở trên, câu lệnh in đầu tiên tạo ra một đầu ra trong đó \ t được giải quyết thành một tab dọc và được bỏ qua trong đầu ra. Mặt khác, trong tuyên bố in thứ hai, \ J vẫn tồn tại, vì không có giải pháp pháp lý nào cho chuỗi đó tồn tại.\t got resolved into a vertical tab and is omitted in the output. On the other hand, in the second print statement, the \j persists, as no legal resolution for that sequence exists.

Ngăn chặn sự giải thích trình tự thoát

Có những trường hợp chúng tôi không muốn các chuỗi hành xử theo cách này. Trong những trường hợp đó, chúng tôi thường muốn bảo tồn các dấu gạch chéo ngược. Một số tình huống có thể yêu cầu điều này là:

  • Chuỗi chứa một mạng hoặc đường dẫn cục bộ
  • Chuỗi chứa regex, sẽ được xử lý thêm bởi động cơ regex

Phương pháp phòng ngừa

Phương pháp 1:

Liên tục nhân đôi các dấu gạch chéo ngược, cũng cho phép chúng tôi khắc phục các vấn đề như vậy. Trong phương pháp này, chúng tôi theo cách thủ công mọi dấu gạch chéo ngược trong chuỗi và nối lại một dấu gạch chéo ngược khác với nó (ở vị trí ngay lập tức). Nói chung, một phương pháp tẻ nhạt, và chỉ khuyên nếu kích thước chuỗi ít hơn. & NBSP;

Python3

>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test
6
>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test
7
>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test
8

>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve   test
8
>>> print('Ernő \\t Rubik'.encode('latin-1').decode('unicode_escape'))
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range(256)
0

>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test
6
>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test
7
>>> print('Ernő \\t Rubik'.encode('latin-1').decode('unicode_escape'))
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range(256)
3

>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve   test
8
>>> print('Ernő \\t Rubik'.encode('latin-1').decode('unicode_escape'))
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range(256)
0

Output:

I love to use      instead of using 4 spaces
I love to use \t instead of using 4 spaces

Phương pháp 2:

Sử dụng Riêu. Thường được gọi là các chuỗi thô, được sử dụng để bảo tồn các chuỗi thoát như nghĩa đen. Sao cho nó thực hiện những gì phương pháp trước đó đã làm nhưng tự động (không yêu cầu sự can thiệp của con người). Để biến một chuỗi bình thường thành một chuỗi thô, tiền tố chuỗi (trước khi báo giá) với R hoặc R. Đây là phương pháp được lựa chọn để khắc phục vấn đề trình tự thoát này. & NBSP;r’….’ or R’…..’ construct. Commonly referred to as raw strings, which is used to preserve the escape sequences as literals. Such that it does what the previous method did but automatically (does not require human intervention). For turning a normal string into a raw string, prefix the string (before the quote) with an r or R. This is the method of choice for overcoming this escape sequence problem. 

Python3

>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test
6
>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test
7
>>> print('Ernő \\t Rubik'.encode('latin-1').decode('unicode_escape'))
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range(256)
8

>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve   test
8
>>> print('Ernő \\t Rubik'.encode('latin-1').decode('unicode_escape'))
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range(256)
0

>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test
6
>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test
7
import re
import codecs

ESCAPE_SEQUENCE_RE = re.compile(r'''
    ( \\U........      # 8-digit hex escapes
    | \\u....          # 4-digit hex escapes
    | \\x..            # 2-digit hex escapes
    | \\[0-7]{1,3}     # Octal escapes
    | \\N\{[^}]+\}     # Unicode characters by name
    | \\[\\'"abfnrtv]  # Single-character escapes
    )''', re.UNICODE | re.VERBOSE)

def decode_escapes(s):
    def decode_match(match):
        return codecs.decode(match.group(0), 'unicode-escape')

    return ESCAPE_SEQUENCE_RE.sub(decode_match, s)
3
>>> print('Ernő \\t Rubik'.encode('latin-1').decode('unicode_escape'))
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range(256)
8

>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve   test
8
>>> print('Ernő \\t Rubik'.encode('latin-1').decode('unicode_escape'))
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range(256)
0

Output:

C:\Program Files
ortonppx
C:\Program Files\norton\appx

Các vấn đề do ký tự thoát có thể không phải lúc nào cũng dẫn đến đầu ra không mong muốn, mà còn lỗi. Ví dụ: mã dưới đây khi thực thi sẽ tạo ra lỗi.

Python3

>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve   test
8
>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve   test
9
import re
import codecs

ESCAPE_SEQUENCE_RE = re.compile(r'''
    ( \\U........      # 8-digit hex escapes
    | \\u....          # 4-digit hex escapes
    | \\x..            # 2-digit hex escapes
    | \\[0-7]{1,3}     # Octal escapes
    | \\N\{[^}]+\}     # Unicode characters by name
    | \\[\\'"abfnrtv]  # Single-character escapes
    )''', re.UNICODE | re.VERBOSE)

def decode_escapes(s):
    def decode_match(match):
        return codecs.decode(match.group(0), 'unicode-escape')

    return ESCAPE_SEQUENCE_RE.sub(decode_match, s)
9
>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test
1

Tạo ra lỗi sau

in (C C: \ users \ Desktop \ json,) & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;
       ^ 
SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3: truncated \UXXXXXXXX escape
 

Lỗi được gây ra bởi vì & nbsp; Dẫn đến một lỗi là ký tự tiếp theo là S & NBSP; nằm ngoài phạm vi 16 cơ sở. & nbsp;\U  in the string leads to the next 4 characters being treated as a 32-bit Hexadecimal value which would correspond to a Unicode code point. Which leads to an error as the next character is which are outside the base 16 range. 


Làm cách nào để ngăn các nhân vật thoát khỏi Python?

Để biến một chuỗi bình thường thành một chuỗi thô, tiền tố chuỗi (trước khi trích dẫn) bằng R hoặc R. Đây là phương pháp được lựa chọn để khắc phục vấn đề trình tự thoát này.prefix the string (before the quote) with an r or R. This is the method of choice for overcoming this escape sequence problem.

Tại sao Python thêm dấu gạch chéo ngược vào chuỗi?

Trong các chuỗi Python, dấu gạch chéo ngược "\" là một nhân vật đặc biệt, còn được gọi là nhân vật "Escape".Nó được sử dụng để thể hiện các ký tự khoảng trắng nhất định: "\ t" là một tab, "\ n" là một dòng mới và "\ r" là một sự trở lại vận chuyển.Ngược lại, tiền tố một ký tự đặc biệt với "\" biến nó thành một ký tự thông thường.used in representing certain whitespace characters: "\t" is a tab, "\n" is a newline, and "\r" is a carriage return. Conversely, prefixing a special character with "\" turns it into an ordinary character.

Làm cách nào để bỏ qua một ký tự thoát trong một chuỗi?

Trình tự thoát là một tập hợp các ký tự được sử dụng trong các chuỗi chữ có ý nghĩa đặc biệt, chẳng hạn như dòng mới, trang mới hoặc tab.Ví dụ: trình tự thoát \ n đại diện cho một ký tự dòng mới.Để bỏ qua một chuỗi thoát trong tìm kiếm của bạn, hãy dành cho một ký tự dấu gạch chéo ngược vào chuỗi thoát.prepend a backslash character to the escape sequence.

Làm cách nào để thoát các ký tự trong một chuỗi?

Để thêm một khoảng trống giữa các ký tự của chuỗi, hãy gọi phương thức Split () trên chuỗi để lấy một mảng ký tự và gọi phương thức tham gia () trên mảng để tham gia các chuỗi con với bộ phân cách không gian, ví dụ:str.tách ra('').tham gia(' ') .call the split() method on the string to get an array of characters, and call the join() method on the array to join the substrings with a space separator, e.g. str. split(''). join(' ') .