Ký tự đặc biệt trong biểu thức chính quy trong python

Các ký tự đặc biệt khiến việc xử lý văn bản trở nên phức tạp hơn vì bạn phải chú ý nhiều đến ngữ cảnh. Nếu bạn đang xem mã Python có chứa biểu thức chính quy, bạn phải suy nghĩ về những gì bạn thấy, Python thấy gì và công cụ biểu thức chính quy thấy gì. Một ký tự có thể đặc biệt đối với Python nhưng không phải là biểu thức chính quy hoặc ngược lại

Bài đăng này đi qua một ví dụ chi tiết cho thấy cách quản lý các ký tự đặc biệt trong một số ngữ cảnh khác nhau

Thoát các ký tự TeX đặc biệt

Gần đây tôi cần viết một biểu thức chính quy [1] để thoát khỏi các ký tự đặc biệt của TeX. Tôi đang đọc văn bản như ICD9_CODE và cần biến nó thành ICD9\_CODE để TeX hiểu dấu gạch dưới là dấu gạch dưới theo nghĩa đen và hướng dẫn chỉ số dưới

Dấu gạch dưới không phải là ký tự đặc biệt duy nhất trong TeX. Nó có mười ký tự đặc biệt

    \ { } $ & # ^ _ % ~

Hai câu mà mọi người thường vấp phải nhất có lẽ là $

    special = r"\\{}$&#^_%~"
0 vì những câu này khá phổ biến trong văn xuôi thông thường. Vì
    special = r"\\{}$&#^_%~"
0 bắt đầu nhận xét trong TeX, nhập dấu phần trăm mà không thoát nó sẽ bị lỗi âm thầm. Kết quả là hợp lệ về mặt cú pháp. Nó chỉ cắt đứt phần còn lại của dòng một cách hiệu quả

Vì vậy, bất cứ khi nào tập lệnh của tôi nhìn thấy một ký tự đặc biệt TeX chưa được thoát, tôi muốn nó thoát khỏi ký tự đó

dây thô

Trước tiên, tôi cần nói cho Python biết các ký tự đặc biệt dành cho TeX

    special = r"\\{}$&#^_%~"

Có điều gì đó thú vị đang diễn ra ở đây. Hầu hết các ký tự đặc biệt đối với TeX không đặc biệt đối với Python. Nhưng dấu gạch chéo ngược là đặc biệt cho cả hai. Dấu gạch chéo ngược cũng đặc biệt đối với các biểu thức chính quy. Tiền tố

    special = r"\\{}$&#^_%~"
2 trước dấu ngoặc kép cho Python biết đây là chuỗi "thô" và nó không nên hiểu dấu gạch chéo ngược là đặc biệt. Nó nói rằng “Tôi thực sự muốn một chuỗi bắt đầu bằng hai dấu gạch chéo ngược. ”

Tại sao hai dấu gạch chéo ngược? . Thêm về điều đó trong thời gian ngắn

Nhìn về phía sau

Đây là biểu thức chính quy của tôi

    re.sub(r"(?

Tôi muốn các ký tự đặc biệt chưa được thoát, vì vậy tôi đang sử dụng mẫu nhìn phía sau phủ định. Các biểu thức nhìn phía sau tiêu cực bắt đầu bằng

    special = r"\\{}$&#^_%~"
3 và kết thúc bằng
    special = r"\\{}$&#^_%~"
4. Vì vậy, ví dụ, nếu tôi muốn tìm chuỗi “ball” nhưng chỉ khi nó không đứng trước “charity” thì tôi có thể sử dụng biểu thức chính quy

________số 8_______

Cụm từ này sẽ khớp với “foot ball” hoặc “foosball” nhưng không khớp với “charity ball”

Biểu hiện tìm kiếm của chúng ta rất phức tạp bởi thực tế là thứ mà chúng ta đang tìm kiếm lại là một ký tự đặc biệt. Chúng tôi đang tìm dấu gạch chéo ngược, là ký tự đặc biệt cho biểu thức chính quy [2]

Sau khi tìm kiếm dấu gạch chéo ngược phía sau và đảm bảo không có dấu gạch chéo ngược nào, chúng tôi tìm kiếm các ký tự đặc biệt của mình. Lý do chúng tôi sử dụng hai dấu gạch chéo ngược khi xác định biến

    special = r"\\{}$&#^_%~"
5 là để công cụ biểu thức chính quy sẽ nhìn thấy hai dấu gạch chéo ngược và diễn giải đó là một dấu gạch chéo ngược theo nghĩa đen

chụp

Đối số thứ hai của

    special = r"\\{}$&#^_%~"
6 cho nó biết cần thay thế kết quả khớp của nó bằng cái gì. Chúng tôi đặt dấu ngoặc đơn xung quanh lớp ký tự liệt kê các ký tự đặc biệt của TeX vì chúng tôi muốn nắm bắt nó để tham khảo sau này. Các lần chụp được gọi theo vị trí, vì vậy lần chụp đầu tiên là \1, lần chụp thứ hai là \2, v.v.

Chúng tôi muốn yêu cầu

    special = r"\\{}$&#^_%~"
6 đặt dấu gạch chéo ngược trước ảnh chụp đầu tiên. Vì dấu gạch chéo ngược là đặc biệt đối với công cụ biểu thức chính quy, nên chúng tôi gửi nó
    special = r"\\{}$&#^_%~"
8 để biểu thị dấu gạch chéo ngược theo nghĩa đen. Khi chúng tôi làm theo điều này với
    special = r"\\{}$&#^_%~"
9 cho lần chụp đầu tiên, kết quả là
    re.sub(r"(?0 như trên

thử nghiệm

Chúng tôi có thể kiểm tra mã của chúng tôi ở trên bằng cách sau

    line = r"a_b $200 {x} %5 x\y"

và lấy

    a\_b \$200 \{x\} \%5 x\\y

điều này sẽ khiến TeX tạo ra đầu ra giống như

a b $200 {x} %5 x\y

Lưu ý rằng chúng tôi đã sử dụng chuỗi thô cho trường hợp thử nghiệm của mình. Điều đó chỉ cần thiết cho dấu gạch chéo ngược gần cuối chuỗi. Nếu không có điều đó, chúng ta có thể đã bỏ

    special = r"\\{}$&#^_%~"
2 trước câu trích dẫn mở đầu

P. S. trên chuỗi thô

Lưu ý rằng bạn không phải sử dụng chuỗi thô. Bạn chỉ có thể thoát các ký tự đặc biệt của mình bằng dấu gạch chéo ngược. Nhưng chúng tôi đã có rất nhiều dấu gạch chéo ngược ở đây. Nếu không có chuỗi thô, chúng tôi sẽ cần nhiều hơn nữa. Nếu không có chuỗi thô, chúng ta phải nói

    special = "\\\\{}$&#^_%~"

bắt đầu với bốn dấu gạch chéo ngược để gửi Python hai để gửi công cụ biểu thức chính quy một

Bài viết liên quan

  • Bốn mẹo để học biểu thức chính quy
  • Chuyển đổi Unicode/LaTeX
  • Mẹo diễn đạt chính quy hàng ngày qua Twitter

[1] Bất cứ khi nào tôi viết về việc sử dụng biểu thức chính quy, ai đó sẽ phàn nàn rằng giải pháp của tôi không hoàn toàn chung chung và họ có thể tạo đầu vào sẽ phá vỡ mã của tôi. Tôi hiểu điều đó, nhưng nó phù hợp với tôi trong hoàn cảnh của tôi. Tôi chỉ viết kịch bản để hoàn thành công việc của mình, không tuyên bố đã viết phần mềm sản xuất cứng cho bất kỳ ai khác sử dụng

[2] Ghi nhớ ngữ cảnh. Chúng tôi có ba ngôn ngữ đang chơi. TeX, Python và các biểu thức chính quy. Một trong những chìa khóa để hiểu các biểu thức chính quy là xem chúng như một ngôn ngữ nhỏ được nhúng bên trong các ngôn ngữ khác như Python. Vì vậy, bất cứ khi nào bạn nghe một nhân vật là đặc biệt, hãy tự hỏi bản thân “Đặc biệt với ai?”. Điều này đặc biệt khó hiểu ở đây vì dấu gạch chéo ngược đặc biệt đối với cả ba ngôn ngữ

Các ký tự đặc biệt trong Python là gì?

Trong các chuỗi Python, dấu gạch chéo ngược "\" là một ký tự đặc biệt, còn được gọi là ký tự "thoát" . Nó được sử dụng để đại diện cho 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 xuống dòng. Ngược lại, đặt trước một ký tự đặc biệt với "\" sẽ biến ký tự đó thành một ký tự thông thường.

\s trong biểu thức chính quy là gì?

Biểu thức chính quy \s là một lớp ký tự được xác định trước . Nó chỉ ra một ký tự khoảng trắng.

Hai loại ký tự được sử dụng trong biểu thức chính quy trong Python là gì?

Trong RE, chúng tôi sử dụng chữ hoặc ký tự meta . nghĩa đen là chính các ký tự và không có ý nghĩa đặc biệt. Đây là một ví dụ trong đó tôi sử dụng các ký tự để tìm một chuỗi cụ thể trong văn bản bằng cách sử dụng phương thức findall của mô-đun re.