So sánh chuỗi bằng Python

Trong Python, chuỗi là chuỗi ký tự được lưu trữ hiệu quả trong bộ nhớ dưới dạng đối tượng. Mỗi đối tượng có thể được xác định bằng cách sử dụng id() phương pháp, như bạn có thể thấy dưới đây. Python cố gắng sử dụng lại các đối tượng trong bộ nhớ có cùng giá trị, điều này cũng khiến việc so sánh các đối tượng trong Python rất nhanh:

$ python
Python 3.9.0 (v3.9.0:9cf6752276, Oct  5 2020, 11:29:23) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "abc"
>>> b = "abc"
>>> c = "def"
>>> print (id(a), id(b), id(c))
(139949123041320, 139949123041320, 139949122390576)
>>> quit()

Để so sánh các chuỗi, Python cung cấp một số toán tử khác nhau để thực hiện việc đó. Đầu tiên, chúng tôi sẽ giải thích chúng chi tiết hơn dưới đây. Thứ hai, chúng ta sẽ xem xét cả hai stringre mô-đun chứa các phương thức để xử lý các kết quả không phân biệt chữ hoa chữ thường và không chính xác. Thứ ba, để xử lý các chuỗi nhiều dòng, mô-đun khuếch tán khá tiện dụng. Một số ví dụ sẽ giúp bạn hiểu cách sử dụng chúng.

So sánh các Chuỗi với các toán tử == và !=

Là một toán tử so sánh cơ bản, bạn sẽ muốn sử dụng ==!=. Chúng hoạt động theo cách giống hệt như với các giá trị số nguyên và số float. Các == nhà điều hành trả lại True nếu có sự trùng khớp chính xác, nếu không False sẽ được trả lại. Ngược lại, != nhà điều hành trả lại True nếu không có kết quả trùng khớp và trả về False. Liệt kê 1 chứng minh điều này.

Trong một for vòng lặp, một chuỗi chứa tên thành phố Thụy Sĩ “Lausanne” được so sánh với một mục từ danh sách các địa điểm khác và kết quả so sánh được in trên thiết bị xuất chuẩn.

Liệt kê 1:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"

for place in listOfPlaces:
    print (f"comparing {place} with {currentCity}: %{place == currentCity}")

Chạy tập lệnh Python từ phía trên, đầu ra như sau:

$ python3 comparing-strings.py
comparing Berlin with Lausanne: False
comparing Paris with Lausanne: False
comparing Lausanne with Lausanne: True

Sản phẩm ==is Các nhà khai thác

Python có hai toán tử so sánh ==is. Thoạt nhìn chúng có vẻ giống nhau, nhưng thực ra không phải vậy.

== so sánh hai biến dựa trên giá trị mà chúng đại diện. Ngược lại, is toán tử so sánh hai biến dựa trên ID đối tượng trong bộ nhớ.

John (Doe) và John (Moe) đều được gọi là John. Nếu chúng ta có thể rút gọn họ thành tên, họ sẽ có giá trị ngang nhau, nhưng vẫn là hai người khác nhau về mặt chất lượng.

Ví dụ tiếp theo chứng minh điều đó đối với ba biến có giá trị chuỗi. Hai biến ab có cùng giá trị và Python tham chiếu đến cùng một đối tượng để giảm thiểu việc sử dụng bộ nhớ.

Điều này được thực hiện cho các kiểu và chuỗi đơn giản theo mặc định, nhưng không được thực hiện cho các đối tượng khác:

>>> a = 'hello'
>>> b = 'hello'
>>> c = 'world'
>>> a is b
True
>>> a is c
False
>>> id(a)
140666888153840
>>> id(b)
140666888153840
>>> 

Ngay khi giá trị thay đổi, Python sẽ khởi tạo lại đối tượng và gán biến. Trong đoạn mã tiếp theo b nhận giá trị là 2 và sau đó bc đề cập đến cùng một đối tượng:

>>> b = 'world'
>>> id(b)
140666888154416
>>> id(c)
140666888154416

Thêm toán tử so sánh

Để so sánh về thứ tự từ điển, bạn có thể sử dụng toán tử so sánh <, >, <=>=. Bản thân việc so sánh được thực hiện theo từng ký tự. Thứ tự phụ thuộc vào thứ tự của các ký tự trong bảng chữ cái. Thứ tự này phụ thuộc vào bảng ký tự được sử dụng trên máy của bạn khi thực thi mã Python.

Hãy nhớ rằng thứ tự có phân biệt chữ hoa chữ thường. Lấy ví dụ về bảng chữ cái Latinh, “Bus” đứng trước “bus”. Liệt kê 2 cho thấy các toán tử so sánh này hoạt động như thế nào trong thực tế.

Liệt kê 2:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "Lausanne"

for place in listOfPlaces:
    if place < currentCity:
            print (f"{place} comes before {currentCity}")
    elif place > currentCity:
            print (f"{place} comes after {currentCity}")
    else:
            print (f"{place} is equal to {currentCity}")

Chạy tập lệnh Python từ phía trên, đầu ra như sau:

$ python3 comparing-strings-order.py
Berlin comes before Lausanne
Paris comes after Lausanne
Lausanne is equal to Lausanne

So sánh chuỗi không phân biệt chữ hoa chữ thường

Các ví dụ trước tập trung vào việc so khớp chính xác giữa các chuỗi. Để cho phép so sánh không phân biệt chữ hoa chữ thường, Python cung cấp các phương thức chuỗi đặc biệt như upper()lower(). Cả hai đều có sẵn trực tiếp dưới dạng phương thức của đối tượng chuỗi tương ứng.

upper() chuyển đổi toàn bộ chuỗi thành chữ in hoa và lower() tương ứng thành chữ thường. Dựa trên Liệt kê 1 danh sách tiếp theo cho biết cách sử dụng lower() phương pháp.

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Liệt kê 3:


listOfPlaces = ["Berlin", "Paris", "Lausanne"]
currentCity = "lausANne"

for place in listOfPlaces:
    print (f"comparing {place} with {place.lower() == currentCity.lower()}: {currentCity}")

Kết quả như sau:

$ python3 comparing-strings-case-insensitive.py
comparing Berlin with lausANne: False
comparing Paris with lausANne: False
comparing Lausanne with lausANne: True

So sánh các chuỗi bằng biểu thức chính quy (RegEx)

A Regular Expression – hay gọi tắt là “regex” – xác định một mẫu ký tự cụ thể.

Để sử dụng cơ chế này trong Python, hãy nhập re mô-đun đầu tiên và xác định một mẫu cụ thể, tiếp theo. Một lần nữa, ví dụ sau đây dựa trên Liệt kê 1. Mẫu tìm kiếm khớp với "bay" và bắt đầu bằng chữ thường hoặc chữ in hoa. Chính xác, mã Python sau đây tìm thấy tất cả các chuỗi trong đó mẫu tìm kiếm xuất hiện bất kể vị trí nào của chuỗi – ở đầu, ở giữa hay ở cuối.

Liệt kê 4:


import re


listOfPlaces = ["Bayswater", "Table Bay", "Bejing", "Bombay"]


pattern = re.compile("[Bb]ay")

for place in listOfPlaces:
    if pattern.search(place):
        print (f"{place} matches the search pattern")

Kết quả đầu ra như sau và khớp với “Bayswater”, “Table Bay” và “Bombay” từ danh sách các địa điểm:

$ python3 comparing-strings-re.py
Bayswater matches the search pattern
Table Bay matches the search pattern
Bombay matches the search pattern

So sánh nhiều dòng và danh sách

Cho đến nay sự so sánh của chúng tôi chỉ có một vài từ. Sử dụng difflib mô-đun Python cũng cung cấp cách so sánh các chuỗi nhiều dòng và toàn bộ danh sách các từ. Đầu ra có thể được cấu hình theo các định dạng khác nhau của các công cụ khác nhau.

Ví dụ tiếp theo (Liệt kê 5) so sánh hai chuỗi nhiều dòng theo từng dòng và hiển thị các thao tác xóa cũng như bổ sung. Sau khi khởi tạo Differ đối tượng ở dòng 12 việc so sánh được thực hiện bằng cách sử dụng compare() phương pháp ở dòng 15. Kết quả được in trên đầu ra tiêu chuẩn:


import difflib
 


original = ["About the IIS", "", "IIS 8.5 has several improvements related", "to performance in large-scale scenarios, such", "as those used by commercial hosting providers and Microsoft's", "own cloud offerings."]


edited = ["About the IIS", "", "It has several improvements related", "to performance in large-scale scenarios."]


d = difflib.Differ()
 

diff = d.compare(original, edited)
 

print ('n'.join(diff))

Chạy tập lệnh sẽ tạo ra kết quả như bên dưới. Các dòng bị xóa được chỉ định bởi - dấu hiệu trong khi các dòng có phần bổ sung bắt đầu bằng một + dấu hiệu. Hơn nữa, các dòng có thay đổi bắt đầu bằng dấu chấm hỏi. Những thay đổi được biểu thị bằng cách sử dụng ^ dấu hiệu ở vị trí tương ứng. Các dòng không có chỉ báo vẫn giống nhau:

$ python comparing-strings-difflib.py
  About the IIS
  
- IIS 8.5 has several improvements related
?  ^^^^^^

+ It has several improvements related
?  ^

- to performance in large-scale scenarios, such
?                                        ^^^^^^

+ to performance in large-scale scenarios.
?                                        ^

- as those used by commercial hosting providers and Microsoft's
- own cloud offerings.

Kết luận

Trong bài viết này, bạn đã học được nhiều cách khác nhau để so sánh các chuỗi trong Python. Chúng tôi hy vọng rằng phần tổng quan này sẽ giúp bạn lập trình hiệu quả trong cuộc sống lập trình viên của mình.

Lời cảm ơn

Tác giả xin cảm ơn Mandy Neumeyer đã hỗ trợ trong quá trình chuẩn bị bài viết.

Dấu thời gian:

Thêm từ xếp chồng lên nhau