Có một số cách để trích dẫn chuỗi trong Python. Ba dấu ngoặc kép để chuỗi trải dài trên nhiều dòng. Ngắt dòng trong tệp nguồn của bạn trở thành ký tự ngắt dòng trong chuỗi của bạn. Chuỗi trích dẫn ba lần trong Python hoạt động giống như “here doc” trong các ngôn ngữ khác
Tuy nhiên, các quy tắc thụt đầu dòng của Python làm phức tạp vấn đề vì việc thụt đầu dòng trở thành một phần của chuỗi được trích dẫn. Ví dụ: giả sử bạn có đoạn mã sau bên ngoài một hàm
x = """\ abc def ghi """
Sau đó, bạn chuyển cái này vào một hàm
def foo[]: y = """\ abc def ghi """0 và đổi tên thành
def foo[]: y = """\ abc def ghi """1
def foo[]: y = """\ abc def ghi """
Bây giờ
def foo[]: y = """\ abc def ghi """2 và
def foo[]: y = """\ abc def ghi """1 là các chuỗi khác nhau. Cái trước bắt đầu bằng
def foo[]: y = """\ abc def ghi """4 và cái sau bắt đầu bằng bốn khoảng trắng. [Dấu gạch chéo ngược sau dấu ngoặc kép mở đầu ngăn không cho dòng mới sau trở thành một phần của chuỗi được trích dẫn. Nếu không thì
def foo[]: y = """\ abc def ghi """2 và
def foo[]: y = """\ abc def ghi """1 sẽ bắt đầu bằng một dòng mới. ] Chuỗi
def foo[]: y = """\ abc def ghi """1 cũng có bốn khoảng trắng phía trước
def foo[]: y = """\ abc def ghi """8 và bốn khoảng trắng phía trước
def foo[]: y = """\ abc def ghi """9. Bạn không thể đẩy nội dung chuỗi sang lề trái vì điều đó sẽ vi phạm quy tắc định dạng của Python. [Cập nhật. Ồ vâng, bạn có thể. Xem bình luận của Aaron Meurer bên dưới. ]
Bây giờ chúng tôi đưa ra ba giải pháp cho vấn đề này
Giải pháp 1. bọc văn bản. vết lõm
Có một hàm trong thư viện chuẩn Python sẽ loại bỏ khoảng trống không mong muốn ra khỏi chuỗi
def foo[]: y = """\ abc def ghi """1
def foo[]: y = """\ abc def ghi """3
Điều này hiệu quả, nhưng theo tôi, cách tiếp cận tốt hơn là sử dụng cụm từ thông dụng [1]
Giải pháp 2. Biểu thức chính quy có cờ
Chúng tôi muốn xóa khoảng trắng và biểu thức chính quy cho ký tự khoảng trắng là
def foo[]: y = """\ abc def ghi """31. Chúng tôi muốn xóa một hoặc nhiều khoảng trắng nên chúng tôi thêm
def foo[]: y = """\ abc def ghi """32 vào cuối. Nhưng nói chung, chúng tôi không muốn xóa tất cả khoảng trắng, chỉ xóa khoảng trắng ở đầu dòng, vì vậy chúng tôi dán
def foo[]: y = """\ abc def ghi """33 ở phía trước để nói rằng chúng tôi muốn khớp khoảng trắng ở đầu dòng
def foo[]: y = """\ abc def ghi """7
Thật không may, điều này không hoạt động. Theo mặc định,
def foo[]: y = """\ abc def ghi """33 chỉ khớp với phần đầu của chuỗi, không khớp với phần đầu của dòng. Vì vậy, nó sẽ chỉ xóa khoảng trắng phía trước dòng đầu tiên;
Một giải pháp là thêm cờ
def foo[]: y = """\ abc def ghi """35 vào chức năng thay thế. Điều này sẽ báo hiệu rằng chúng tôi muốn
def foo[]: y = """\ abc def ghi """33 khớp với phần đầu của mỗi
def foo[]: y = """\ abc def ghi """37 trong chuỗi nhiều dòng của chúng tôi
def foo[]: y = """\ abc def ghi """2
Thật không may, điều đó cũng không hiệu quả. Đối số vị trí thứ tư cho
def foo[]: y = """\ abc def ghi """38 là số lượng thay thế cần thực hiện. Nó mặc định là 0, mà thực sự có nghĩa là vô cùng, tôi. e. thay thế tất cả các lần xuất hiện. Ví dụ: bạn có thể đặt
def foo[]: y = """\ abc def ghi """39 thành 1 để chỉ thay thế lần xuất hiện đầu tiên. Nếu chúng tôi không chỉ định
def foo[]: y = """\ abc def ghi """39, chúng tôi phải đặt
def foo[]: y = """\ abc def ghi """71 theo tên thay vì theo vị trí, tôi. e. dòng trên phải là
def foo[]: y = """\ abc def ghi """7
Điều đó hoạt động
Bạn cũng có thể viết tắt
def foo[]: y = """\ abc def ghi """35 thành
def foo[]: y = """\ abc def ghi """73. Cái trước rõ ràng hơn và cái sau nhỏ gọn hơn. Cho mỗi người của riêng mình. Có nhiều hơn một cách để làm điều đó. [2]
Giải pháp 3. Biểu thức chính quy với một công cụ sửa đổi
Theo ý kiến của tôi, tốt hơn là sửa đổi biểu thức chính quy hơn là chuyển vào cờ. Công cụ sửa đổi
def foo[]: y = """\ abc def ghi """74 chỉ định rằng trong phần còn lại của thông thường, ký tự
def foo[]: y = """\ abc def ghi """33 phải khớp với đầu mỗi dòng
def foo[]: y = """\ abc def ghi """2
Một lý do tôi tin rằng điều này tốt hơn là chuyển thông tin từ việc triển khai biểu thức chính quy theo ngôn ngữ cụ thể sang cú pháp biểu thức chính quy được hỗ trợ trong nhiều ngôn ngữ lập trình
Ví dụ, biểu thức chính quy
def foo[]: y = """\ abc def ghi """3
sẽ có cùng ý nghĩa trong Perl và Python. Hai ngôn ngữ có cách diễn đạt bổ ngữ giống nhau [3] nhưng khác cách diễn đạt cờ. Trong Perl, bạn dán một
def foo[]: y = """\ abc def ghi """76 vào cuối toán tử so khớp để thực hiện những gì Python thực hiện với cài đặt
def foo[]: y = """\ abc def ghi """77
Một trong những công cụ sửa đổi được sử dụng phổ biến nhất là
def foo[]: y = """\ abc def ghi """78 để chỉ ra rằng một biểu thức chính quy phải khớp theo cách không phân biệt chữ hoa chữ thường. Perl và Python [và các ngôn ngữ khác] chấp nhận
def foo[]: y = """\ abc def ghi """78 trong biểu thức chính quy, nhưng mỗi ngôn ngữ có cách thêm từ bổ nghĩa riêng. Perl thêm một
def foo[]: y = """\ abc def ghi """20 sau toán tử so khớp và Python sử dụng
def foo[]: y = """\ abc def ghi """9
hoặc
def foo[]: y = """\ abc def ghi """0
như một đối số chức năng
Tìm hiểu thêm về biểu thức chính quy
- Biểu thức chính quy trong Perl và Python
- Cụm từ thông dụng với tiếng Do Thái và tiếng Hy Lạp
- Tại sao biểu thức chính quy khó
[1] Vâng, tôi đã nghe câu châm ngôn về hai vấn đề. Thật buồn cười, nhưng nó không phải là một quy luật phổ quát
[2] “Có nhiều hơn một cách để làm điều đó” là một câu thần chú của Perl và mâu thuẫn với The Zen of Python. Tôi sử dụng dòng ở đây như một lời châm chọc tốt bụng vào Python. Bất chấp những lý tưởng đã nêu, Python có nhiều điểm chung với Perl hơn là nó muốn thừa nhận và tiếp tục áp dụng các ý tưởng từ Perl
[3] Mô-đun
def foo[]: y = """\ abc def ghi """21 của Python không hỗ trợ mọi công cụ sửa đổi biểu thức chính quy mà Perl hỗ trợ. Tôi không biết về mô-đun
def foo[]: y = """\ abc def ghi """22 của Python