Python difflib thay thế

Hướng dẫn cách kiểm tra 2 chuỗi bằng nhau hay giống nhau. Tìm hiểu cách tìm sự khác biệt giữa hai chuỗi. Thực hiện các phép so sánh phức tạp và hơn thế nữa

Miguel Brito

·28 tháng 11 năm 2021·12 phút đọc

Chơi bài viết này

Trình duyệt của bạn không hỗ trợ phần tử âm thanh. TỐC ĐỘ1X

So sánh các chuỗi là một nhiệm vụ cơ bản phổ biến đối với bất kỳ ngôn ngữ lập trình nào

Khi nói đến Python, có một số cách để làm điều đó. Cái tốt nhất sẽ luôn phụ thuộc vào trường hợp sử dụng, nhưng chúng tôi có thể thu hẹp chúng thành một số phù hợp nhất với mục tiêu này

Trong bài viết này, chúng tôi sẽ làm chính xác điều đó

Đến cuối hướng dẫn này, bạn sẽ học được

Đi nào

So sánh các chuỗi sử dụng toán tử >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 2 và >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 3

Cách đơn giản nhất để kiểm tra xem hai chuỗi có bằng nhau trong Python hay không là sử dụng toán tử >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 2. Và nếu bạn đang tìm kiếm điều ngược lại, thì >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 3 chính là thứ bạn cần. Đó là nó

>>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 2 và >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 3 là các toán tử boolean, nghĩa là chúng trả về >>> name = 'maria' >>> another_name = 'marcus' >>> name < another_name False >>> name > another_name True >>> name <= another_name False >>> name >= another_name True 5 hoặc >>> name = 'maria' >>> another_name = 'marcus' >>> name < another_name False >>> name > another_name True >>> name <= another_name False >>> name >= another_name True 6. Ví dụ: >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 2 trả về >>> name = 'maria' >>> another_name = 'marcus' >>> name < another_name False >>> name > another_name True >>> name <= another_name False >>> name >= another_name True 5 nếu hai chuỗi khớp nhau và >>> name = 'maria' >>> another_name = 'marcus' >>> name < another_name False >>> name > another_name True >>> name <= another_name False >>> name >= another_name True 6 nếu không

>>> name = 'Carl' >>> another_name = 'Carl' >>> name == another_name True >>> name != another_name False >>> yet_another_name = 'Josh' >>> name == yet_another_name False

Các toán tử này cũng phân biệt chữ hoa chữ thường, có nghĩa là các chữ hoa được xử lý khác nhau. Ví dụ bên dưới chỉ ra rằng, >>> name = 'Maria' >>> another_name = 'marcus' >>> name < another_name True >>> ord('M') < ord('m') True >>> ord('M') 77 >>> ord('m') 109 0 bắt đầu bằng chữ hoa >>> name = 'Maria' >>> another_name = 'marcus' >>> name < another_name True >>> ord('M') < ord('m') True >>> ord('M') 77 >>> ord('m') 109 1 trong khi >>> name = 'Maria' >>> another_name = 'marcus' >>> name < another_name True >>> ord('M') < ord('m') True >>> ord('M') 77 >>> ord('m') 109 2 bắt đầu bằng chữ thường >>> name = 'Maria' >>> another_name = 'marcus' >>> name < another_name True >>> ord('M') < ord('m') True >>> ord('M') 77 >>> ord('m') 109 3. Kết quả là, Python trả về >>> name = 'maria' >>> another_name = 'marcus' >>> name < another_name False >>> name > another_name True >>> name <= another_name False >>> name >= another_name True 6 khi so sánh chúng với >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 2

>>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True

So sánh các chuỗi sử dụng toán tử >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 4

Một cách khác để so sánh xem hai chuỗi có bằng nhau trong Python hay không là sử dụng toán tử >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 4. Tuy nhiên, kiểu so sánh mà nó thực hiện khác với >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 2. Toán tử >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 4 so sánh xem 2 chuỗi có giống nhau không

Trong Python—và trong nhiều ngôn ngữ khác—chúng ta nói hai đối tượng là cùng một thể hiện nếu chúng là cùng một đối tượng trong bộ nhớ

>>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816

Hình ảnh dưới đây cho thấy ví dụ này sẽ được thể hiện như thế nào trong bộ nhớ

Như bạn thấy, chúng tôi đang so sánh danh tính, không phải nội dung. Các đối tượng có cùng danh tính thường có cùng tham chiếu và chia sẻ cùng một vị trí bộ nhớ. Hãy ghi nhớ điều đó khi sử dụng toán tử >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 4

Comparing strings using the , = operators

Cách thứ ba để so sánh các chuỗi là theo thứ tự bảng chữ cái. Điều này rất hữu ích khi chúng ta cần xác định thứ tự từ điển của hai chuỗi

Hãy xem một ví dụ

>>> name = 'maria' >>> another_name = 'marcus' >>> name < another_name False >>> name > another_name True >>> name <= another_name False >>> name >= another_name True

Để xác định thứ tự, Python so sánh các chuỗi char với char. Trong ví dụ của chúng ta, ba chữ cái đầu tiên giống nhau >>> a = '2' >>> b = '10' >>> a < b False >>> a <= b False >>> a > b True >>> a >= b True 1, nhưng chữ cái tiếp theo thì không, >>> a = '2' >>> b = '10' >>> a < b False >>> a <= b False >>> a > b True >>> a >= b True 2 từ >>> a = '2' >>> b = '10' >>> a < b False >>> a <= b False >>> a > b True >>> a >= b True 3 đứng trước >>> a = '2' >>> b = '10' >>> a < b False >>> a <= b False >>> a > b True >>> a >= b True 4 từ >>> a = '2' >>> b = '10' >>> a < b False >>> a <= b False >>> a > b True >>> a >= b True 5

Điều quan trọng cần lưu ý là so sánh này phân biệt chữ hoa chữ thường. Python xử lý chữ hoa và chữ thường khác nhau. Ví dụ: nếu chúng ta thay đổi >>> a = '2' >>> b = '10' >>> a < b False >>> a <= b False >>> a > b True >>> a >= b True 6 thành >>> a = '2' >>> b = '10' >>> a < b False >>> a <= b False >>> a > b True >>> a >= b True 7, thì kết quả sẽ khác vì >>> a = '2' >>> b = '10' >>> a < b False >>> a <= b False >>> a > b True >>> a >= b True 8 đứng trước >>> a = '2' >>> b = '10' >>> a < b False >>> a <= b False >>> a > b True >>> a >= b True 9

>>> name = 'Maria' >>> another_name = 'marcus' >>> name < another_name True >>> ord('M') < ord('m') True >>> ord('M') 77 >>> ord('m') 109

⚠️ CẢNH BÁO ⚠️. Tránh so sánh các chuỗi biểu thị số bằng các toán tử này. Việc so sánh được thực hiện dựa trên thứ tự bảng chữ cái, khiến cho >>> a = 'Atraße' >>> a = 'Straße' >>> b = 'strasse' >>> a.lower() == b.lower() False >>> a.lower() 'straße' >>> b.lower() 'strasse' 0 được đánh giá thành >>> name = 'maria' >>> another_name = 'marcus' >>> name < another_name False >>> name > another_name True >>> name <= another_name False >>> name >= another_name True 6

>>> a = '2' >>> b = '10' >>> a < b False >>> a <= b False >>> a > b True >>> a >= b True

So sánh hai chuỗi bằng cách bỏ qua trường hợp

Đôi khi chúng ta có thể cần so sánh hai chuỗi—một danh sách các chuỗi hoặc thậm chí một từ điển các chuỗi—bất kể trường hợp nào

Đạt được điều đó sẽ phụ thuộc vào bảng chữ cái mà chúng ta đang xử lý. Đối với chuỗi ASCII, chúng ta có thể chuyển đổi cả hai chuỗi thành chữ thường bằng cách sử dụng >>> a = 'Atraße' >>> a = 'Straße' >>> b = 'strasse' >>> a.lower() == b.lower() False >>> a.lower() 'straße' >>> b.lower() 'strasse' 2 hoặc viết hoa bằng >>> a = 'Atraße' >>> a = 'Straße' >>> b = 'strasse' >>> a.lower() == b.lower() False >>> a.lower() 'straße' >>> b.lower() 'strasse' 3 và so sánh chúng

Đối với các bảng chữ cái khác, chẳng hạn như tiếng Hy Lạp hoặc tiếng Đức, việc chuyển đổi thành chữ thường để làm cho chuỗi phân biệt chữ hoa chữ thường không phải lúc nào cũng hoạt động. Hãy xem một số ví dụ

Giả sử chúng ta có một chuỗi bằng tiếng Đức có tên là >>> a = 'Atraße' >>> a = 'Straße' >>> b = 'strasse' >>> a.lower() == b.lower() False >>> a.lower() 'straße' >>> b.lower() 'strasse' 4, có nghĩa là >>> a = 'Atraße' >>> a = 'Straße' >>> b = 'strasse' >>> a.lower() == b.lower() False >>> a.lower() 'straße' >>> b.lower() 'strasse' 5. Bạn cũng có thể viết cùng một từ mà không có >>> a = 'Atraße' >>> a = 'Straße' >>> b = 'strasse' >>> a.lower() == b.lower() False >>> a.lower() 'straße' >>> b.lower() 'strasse' 6, trong trường hợp này, từ đó trở thành >>> a = 'Atraße' >>> a = 'Straße' >>> b = 'strasse' >>> a.lower() == b.lower() False >>> a.lower() 'straße' >>> b.lower() 'strasse' 7. Nếu chúng ta cố gắng viết thường hoặc viết hoa, hãy xem điều gì sẽ xảy ra

>>> a = 'Atraße' >>> a = 'Straße' >>> b = 'strasse' >>> a.lower() == b.lower() False >>> a.lower() 'straße' >>> b.lower() 'strasse'

Điều đó xảy ra bởi vì một cuộc gọi đơn giản tới >>> a = 'Atraße' >>> a = 'Straße' >>> b = 'strasse' >>> a.lower() == b.lower() False >>> a.lower() 'straße' >>> b.lower() 'strasse' 2 sẽ không làm gì với >>> a = 'Atraße' >>> a = 'Straße' >>> b = 'strasse' >>> a.lower() == b.lower() False >>> a.lower() 'straße' >>> b.lower() 'strasse' 6. Dạng chữ thường của nó tương đương với >>> a = 'Straße' >>> b = 'strasse' >>> a.casefold() == b.casefold() True >>> a.casefold() 'strasse' >>> b.casefold() 'strasse' 0 nhưng bản thân >>> a = 'Atraße' >>> a = 'Straße' >>> b = 'strasse' >>> a.lower() == b.lower() False >>> a.lower() 'straße' >>> b.lower() 'strasse' 6 có dạng và hình dạng giống nhau ở dạng chữ thường hoặc chữ hoa

Cách tốt nhất để bỏ qua chữ hoa chữ thường và thực hiện so sánh chuỗi phân biệt chữ hoa chữ thường hiệu quả là sử dụng. Theo

Casefolding tương tự như chữ thường nhưng tích cực hơn vì nó nhằm mục đích loại bỏ tất cả các phân biệt chữ hoa chữ thường trong một chuỗi

Hãy xem điều gì xảy ra khi chúng ta sử dụng >>> a = 'Straße' >>> b = 'strasse' >>> a.casefold() == b.casefold() True >>> a.casefold() 'strasse' >>> b.casefold() 'strasse' 2 thay thế

>>> a = 'Straße' >>> b = 'strasse' >>> a.casefold() == b.casefold() True >>> a.casefold() 'strasse' >>> b.casefold() 'strasse'

Cách so sánh hai chuỗi và bỏ qua khoảng trắng

Đôi khi bạn có thể muốn so sánh hai chuỗi bằng cách bỏ qua các ký tự khoảng trắng. Giải pháp tốt nhất cho vấn đề này phụ thuộc vào vị trí của khoảng trắng, liệu có nhiều khoảng trắng trong chuỗi hay không, v.v.

Ví dụ đầu tiên chúng ta sẽ xem xét rằng sự khác biệt duy nhất giữa các chuỗi là một trong số chúng có khoảng trắng ở đầu và/hoặc ở cuối. Trong trường hợp này, chúng ta có thể cắt cả hai chuỗi bằng cách sử dụng phương pháp >>> a = 'Straße' >>> b = 'strasse' >>> a.casefold() == b.casefold() True >>> a.casefold() 'strasse' >>> b.casefold() 'strasse' 4 và sử dụng toán tử >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 2 để so sánh chúng

>>> s1 = 'Hey, I really like this post.' >>> s2 = ' Hey, I really like this post. ' >>> s1.strip() == s2.strip() True

Tuy nhiên, đôi khi bạn có một chuỗi có khoảng trắng ở khắp nơi, bao gồm nhiều khoảng trắng bên trong chuỗi. Nếu đúng như vậy thì >>> a = 'Straße' >>> b = 'strasse' >>> a.casefold() == b.casefold() True >>> a.casefold() 'strasse' >>> b.casefold() 'strasse' 4 vẫn chưa đủ

>>> s2 = ' Hey, I really like this post. ' >>> s1 = 'Hey, I really like this post.' >>> s1.strip() == s2.strip() False

Sự thay thế sau đó là. Phương thức này chỉ trả về các ký tự trùng lặp, vì vậy chúng ta vẫn cần loại bỏ các ký tự đầu và cuối

>>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True 0

Hoặc nếu bạn không quan tâm đến các bản sao và muốn xóa mọi thứ, thì chỉ cần chuyển chuỗi trống làm đối số thứ hai cho >>> a = 'Straße' >>> b = 'strasse' >>> a.casefold() == b.casefold() True >>> a.casefold() 'strasse' >>> b.casefold() 'strasse' 7

>>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True 1

Phương pháp cuối cùng và cuối cùng là sử dụng bảng dịch. Giải pháp này là một giải pháp thay thế thú vị cho regex

>>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True 2

Một điều thú vị về phương pháp này là nó cho phép loại bỏ không chỉ khoảng trắng mà cả các ký tự khác như dấu chấm câu.

>>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True 3

Cách so sánh hai chuỗi cho giống nhau (khớp chuỗi mờ)

Một trường hợp sử dụng so sánh chuỗi phổ biến khác là kiểm tra xem hai chuỗi có gần bằng nhau không. Trong nhiệm vụ này, chúng tôi quan tâm đến việc biết chúng giống nhau như thế nào thay vì so sánh sự bằng nhau của chúng

Để dễ hiểu hơn, hãy xem xét một kịch bản khi chúng ta có hai chuỗi và chúng ta sẵn sàng bỏ qua lỗi chính tả. Thật không may, điều đó là không thể với toán tử >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 2

Chúng ta có thể giải quyết vấn đề này theo hai cách khác nhau

  • sử dụng >>> a = 'Straße' >>> b = 'strasse' >>> a.casefold() == b.casefold() True >>> a.casefold() 'strasse' >>> b.casefold() 'strasse' 9 từ thư viện tiêu chuẩn
  • sử dụng thư viện bên ngoài, chẳng hạn như >>> s1 = 'Hey, I really like this post.' >>> s2 = ' Hey, I really like this post. ' >>> s1.strip() == s2.strip() True 0

Sử dụng >>> a = 'Straße' >>> b = 'strasse' >>> a.casefold() == b.casefold() True >>> a.casefold() 'strasse' >>> b.casefold() 'strasse' 9

>>> a = 'Straße' >>> b = 'strasse' >>> a.casefold() == b.casefold() True >>> a.casefold() 'strasse' >>> b.casefold() 'strasse' 9 trong thư viện tiêu chuẩn có lớp >>> s1 = 'Hey, I really like this post.' >>> s2 = ' Hey, I really like this post. ' >>> s1.strip() == s2.strip() True 3 cung cấp phương thức >>> s1 = 'Hey, I really like this post.' >>> s2 = ' Hey, I really like this post. ' >>> s1.strip() == s2.strip() True 4 trả về thước đo độ tương tự của chuỗi dưới dạng phần trăm

Giả sử bạn có hai chuỗi giống nhau, chẳng hạn như >>> s1 = 'Hey, I really like this post.' >>> s2 = ' Hey, I really like this post. ' >>> s1.strip() == s2.strip() True 5 và >>> s1 = 'Hey, I really like this post.' >>> s2 = ' Hey, I really like this post. ' >>> s1.strip() == s2.strip() True 6. Sự khác biệt duy nhất giữa chúng là chữ cái cuối cùng. Hãy tưởng tượng rằng sự khác biệt này đủ nhỏ đối với bạn và bạn muốn bỏ qua nó

Bằng cách sử dụng >>> s1 = 'Hey, I really like this post.' >>> s2 = ' Hey, I really like this post. ' >>> s1.strip() == s2.strip() True 7, chúng ta có thể nhận được tỷ lệ phần trăm mà chúng giống nhau và sử dụng số đó để xác nhận xem hai chuỗi có đủ giống nhau hay không

>>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True 4

Trong ví dụ này, >>> s1 = 'Hey, I really like this post.' >>> s2 = ' Hey, I really like this post. ' >>> s1.strip() == s2.strip() True 3 cho chúng ta biết rằng hai chuỗi giống nhau 85%. Sau đó, chúng tôi có thể sử dụng số này làm ngưỡng và bỏ qua sự khác biệt

>>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True 5

Có một vấn đề, mặc dù. Ngưỡng phụ thuộc vào độ dài của chuỗi. Ví dụ: hai chuỗi rất nhỏ, chẳng hạn như >>> s1 = 'Hey, I really like this post.' >>> s2 = ' Hey, I really like this post. ' >>> s1.strip() == s2.strip() True 9 và >>> s2 = ' Hey, I really like this post. ' >>> s1 = 'Hey, I really like this post.' >>> s1.strip() == s2.strip() False 0 sẽ khác nhau 50%

>>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True 6

Vì vậy, việc thiết lập một ngưỡng phù hợp có thể khó khăn. Thay vào đó, chúng ta có thể thử một thuật toán khác, thuật toán đếm chuyển vị trí của các chữ cái trong một chuỗi. Và tin tốt là, có tồn tại một thuật toán như vậy, và đó là điều chúng ta sẽ thấy tiếp theo

Sử dụng khoảng cách Damerau-Levenshtein

Thuật toán Damerau-Levenshtein đếm số lượng thao tác tối thiểu cần thiết để thay đổi chuỗi này thành chuỗi khác

Nói cách khác, nó cho biết có bao nhiêu lần chèn, xóa hoặc thay thế một ký tự;

Trong Python, chúng ta có thể sử dụng hàm >>> s2 = ' Hey, I really like this post. ' >>> s1 = 'Hey, I really like this post.' >>> s1.strip() == s2.strip() False 1 từ thư viện >>> s1 = 'Hey, I really like this post.' >>> s2 = ' Hey, I really like this post. ' >>> s1.strip() == s2.strip() True 0

Hãy xem khoảng cách Damerau-Levenshtein là bao nhiêu cho ví dụ cuối cùng từ phần trước

>>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True 7

Đó là 1. Vì vậy, điều đó có nghĩa là để biến >>> s2 = ' Hey, I really like this post. ' >>> s1 = 'Hey, I really like this post.' >>> s1.strip() == s2.strip() False 3 thành >>> s2 = ' Hey, I really like this post. ' >>> s1 = 'Hey, I really like this post.' >>> s1.strip() == s2.strip() False 4 chúng ta cần 1 thay đổi. Còn ví dụ đầu tiên thì sao?

>>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True 8

cũng là 1. Và điều đó rất có ý nghĩa, sau cùng chúng ta chỉ cần chỉnh sửa chữ cái cuối cùng để chúng bằng nhau

Bằng cách này, chúng tôi có thể đặt ngưỡng dựa trên số lần thay đổi thay vì tỷ lệ

>>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True 9

Cách so sánh hai chuỗi và trả về sự khác biệt

Đôi khi chúng ta biết trước rằng hai chuỗi khác nhau và chúng ta muốn biết điều gì khiến chúng khác nhau. Nói cách khác, chúng tôi muốn có được "sự khác biệt" của họ

Trong phần trước, chúng tôi đã sử dụng >>> a = 'Straße' >>> b = 'strasse' >>> a.casefold() == b.casefold() True >>> a.casefold() 'strasse' >>> b.casefold() 'strasse' 9 như một cách để biết liệu hai chuỗi có đủ giống nhau hay không. Mô-đun này thực sự mạnh hơn thế và chúng ta có thể sử dụng nó để so sánh các chuỗi và chỉ ra sự khác biệt của chúng

Điều khó chịu là nó yêu cầu một danh sách các chuỗi thay vì chỉ một chuỗi. Sau đó, nó trả về một trình tạo mà bạn có thể sử dụng để nối thành một chuỗi và in sự khác biệt

>>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 0

So sánh chuỗi không hoạt động?

Trong phần này, chúng ta sẽ thảo luận về lý do tại sao phép so sánh chuỗi của bạn không hoạt động và cách khắc phục. Hai lý do chính dựa trên kinh nghiệm của tôi là

  • sử dụng toán tử sai
  • có một dấu cách hoặc dòng mới

So sánh các chuỗi sử dụng >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 4 thay vì >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 2

Điều này rất phổ biến đối với các nhà phát triển Python mới làm quen. Rất dễ sử dụng sai toán tử, đặc biệt khi so sánh các chuỗi

Như chúng ta đã thảo luận trong bài viết này, chỉ sử dụng toán tử >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 4 nếu bạn muốn kiểm tra xem hai chuỗi có phải là cùng một trường hợp không

Có một khoảng trắng ở cuối dòng mới (>>> s2 = ' Hey, I really like this post. ' >>> s1 = 'Hey, I really like this post.' >>> s1.strip() == s2.strip() False 9)

Điều này rất phổ biến khi đọc một chuỗi từ hàm >>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True 00. Bất cứ khi nào chúng tôi sử dụng chức năng này để thu thập thông tin, người dùng có thể vô tình thêm dấu cách

Nếu bạn lưu trữ kết quả từ >>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True 00 trong một biến, bạn sẽ không dễ dàng nhận ra vấn đề

>>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 1

Giải pháp ở đây là loại bỏ khoảng trắng khỏi chuỗi mà người dùng nhập vào rồi so sánh. Bạn có thể làm điều đó với bất kỳ nguồn đầu vào nào mà bạn không tin tưởng

Phần kết luận

Trong hướng dẫn này, chúng ta đã thấy 8 cách khác nhau để so sánh các chuỗi trong Python và hai lỗi phổ biến nhất. Chúng ta đã thấy cách chúng ta có thể tận dụng các hoạt động khác nhau để thực hiện so sánh chuỗi và cách sử dụng các thư viện bên ngoài để thực hiện khớp chuỗi mờ

điểm chính

  • Sử dụng toán tử >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 2 và >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 3 để so sánh hai chuỗi bằng nhau
  • Sử dụng toán tử >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 4 để kiểm tra xem hai chuỗi có giống nhau không
  • Sử dụng các toán tử >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 5, >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 6, >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 7 và >>> name = 'John Jabocs Howard' >>> another_name = name >>> name is another_name True >>> yet_another_name = 'John Jabocs Howard' >>> name is yet_another_name False >>> id(name) 140142470447472 >>> id(another_name) 140142470447472 >>> id(yet_another_name) 140142459568816 8 để so sánh các chuỗi theo thứ tự bảng chữ cái
  • Sử dụng >>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True 09 để so sánh hai chuỗi bỏ qua trường hợp
  • Cắt chuỗi bằng các phương thức gốc hoặc biểu thức chính quy để bỏ qua khoảng trắng khi thực hiện so sánh chuỗi
  • Sử dụng >>> a = 'Straße' >>> b = 'strasse' >>> a.casefold() == b.casefold() True >>> a.casefold() 'strasse' >>> b.casefold() 'strasse' 9 hoặc >>> name = 'Carl' >>> yet_another_name = 'carl' >>> name == yet_another_name False >>> name != yet_another_name True 11 để kiểm tra xem hai chuỗi có gần bằng nhau không (khớp mờ)
  • Sử dụng >>> a = 'Straße' >>> b = 'strasse' >>> a.casefold() == b.casefold() True >>> a.casefold() 'strasse' >>> b.casefold() 'strasse' 9 để so sánh hai chuỗi và trả về sự khác biệt
  • So sánh chuỗi không hoạt động?

Đó là nó cho ngày hôm nay, và tôi hy vọng bạn đã học được điều gì đó mới. Hẹn gặp lại bạn lần sau

Các bài viết khác bạn có thể thích

  • Cách chọn giữa isdigit(), isdecimal() và isnumeric() trong Python

  • Cách tốt nhất để so sánh hai từ điển trong Python

  • Cách tốt nhất để so sánh hai danh sách trong Python

  • 15 cách dễ dàng để cắt chuỗi trong Python

  • cột trụ. Cách khắc phục "c0209. định dạng một chuỗi thông thường có thể là chuỗi f (xem xét sử dụng chuỗi f)"

    Difflib có đi kèm với Python không?

    Difflib — Viên ngọc ẩn trong các thư viện tích hợp Python . Vì nó được tích hợp sẵn trong Python3 nên chúng ta không cần tải hay cài đặt gì cả, chỉ cần import như sau.

    Làm cách nào để làm cho Difflib của tôi nhanh hơn?

    Tạo hai danh sách, chứa các dòng từ mỗi tệp. Sau đó gọi difflib. SequenceMatcher với danh sách dưới dạng tham số . SequenceMatcher biết cách xử lý danh sách và quy trình sẽ nhanh hơn nhiều vì nó được thực hiện trên cơ sở từng dòng thay vì từng ký tự.

    Python SequenceMatcher là gì?

    SequenceMatcher là một lớp có sẵn trong gói Python difflib . Mô-đun difflib cung cấp các lớp và hàm để so sánh trình tự. Nó có thể được sử dụng để so sánh các tệp và có thể tạo thông tin về sự khác biệt của tệp ở các định dạng khác nhau. Lớp này có thể được sử dụng để so sánh hai chuỗi hoặc chuỗi đầu vào.

Chủ đề