Порівняння рядків за допомогою Python

У Python рядки — це послідовності символів, які фактично зберігаються в пам’яті як об’єкт. Кожен об'єкт можна ідентифікувати за допомогою id() метод, як ви можете бачити нижче. Python намагається повторно використовувати об’єкти в пам’яті, які мають однакові значення, що також робить порівняння об’єктів дуже швидким у Python:

$ 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()

Для порівняння рядків Python пропонує кілька різних операторів. Спочатку ми пояснимо їх більш детально нижче. По-друге, ми розглянемо обидва string і re модулі, які містять методи обробки незалежних від регістру та неточних збігів. По-третє, мати справу з багаторядковими рядками модуль difflib досить зручно. Кілька прикладів допоможуть вам зрозуміти, як ними користуватися.

Порівняйте рядки з операторами == та !=

Як основний оператор порівняння, який ви захочете використовувати == та !=. Вони працюють точно так само, як і з цілими числами та значеннями з плаваючою точкою. The == оператор повертається True якщо є точний збіг, інакше False буде повернуто. На противагу цьому != оператор повертається True якщо немає відповідності та в іншому випадку повертається False. Лістинг 1 демонструє це.

В for циклу, рядок, що містить назву швейцарського міста «Лозанна», порівнюється з записом зі списку інших місць, і результат порівняння друкується на stdout.

Лістинг 1:


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

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

Запуск сценарію Python із вищевиведеного результату виглядає наступним чином:

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

Команда == та is Оператори

Python має два оператори порівняння == та is. На перший погляд вони здаються однаковими, але насправді це не так.

== порівнює дві змінні на основі значення, яке вони представляють. На противагу цьому is оператор порівнює дві змінні на основі ідентифікатора об’єкта в пам’яті.

Джона (Лань) і Джона (Мо) обох звуть Джон. Якщо ми зможемо звести їх лише до їхніх імен, вони будуть однаковими за цінністю, але все одно будуть двома різними людьми якісно.

Наступний приклад демонструє це для трьох змінних із рядковими значеннями. Дві змінні a та b мають однакове значення, і Python посилається на той самий об’єкт, щоб мінімізувати використання пам’яті.

Це робиться для простих типів і рядків за замовчуванням, але не для інших об’єктів:

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

Як тільки значення зміниться, Python відновить об’єкт і призначить змінну. У наступному фрагменті коду b отримує значення 2, а потім b та c посилаються на той самий об’єкт:

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

Більше операторів порівняння

Для порівняння щодо лексикографічного порядку ви можете використовувати оператори порівняння <, >, <= та >=. Саме порівняння відбувається посимвольно. Порядок залежить від порядку розташування символів в алфавіті. Цей порядок залежить від таблиці символів, яка використовується на вашій машині під час виконання коду Python.

Майте на увазі, що порядок чутливий до регістру. Як приклад для латинського алфавіту, «Bus» стоїть перед «bus». Лістинг 2 показує, як ці оператори порівняння працюють на практиці.

Лістинг 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}")

Запуск сценарію Python із вищевиведеного результату виглядає наступним чином:

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

Порівняння рядків без урахування регістру

Попередні приклади зосереджені на точних збігах між рядками. Щоб дозволити порівняння без урахування регістру, Python пропонує спеціальні рядкові методи, такі як upper() та lower(). Обидва вони доступні безпосередньо як методи відповідного рядкового об’єкта.

upper() перетворює весь рядок у великі літери, і lower() малими літерами відповідно. На основі Лістинг 1 у наступному списку показано, як використовувати lower() метод.

Ознайомтеся з нашим практичним практичним посібником із вивчення Git з передовими методами, прийнятими в галузі стандартами та включеною шпаргалкою. Припиніть гуглити команди Git і фактично вчитися це!

Лістинг 3:


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

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

Вихід такий:

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

Порівняти рядки за допомогою регулярних виразів (RegEx)

A Регулярні вирази – або скорочено «регулярний вираз» – визначає певний шаблон символів.

Щоб скористатися цим механізмом у Python, імпортуйте re Модулі спочатку та визначте конкретний шаблон, потім. Знову ж таки, наступний приклад базується на Лістинг 1. Шаблон пошуку відповідає слову «bay» і починається або з малої, або з великої літери. Точніше, наступний код Python знаходить усі рядки, в яких зустрічається шаблон пошуку, незалежно від того, в якій позиції рядка – на початку, чи в середині, чи в кінці.

Лістинг 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")

Результат виглядає наступним чином і відповідає «Bayswater», «Table Bay» і «Bombay» зі списку місць:

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

Багаторядкове та спискове порівняння

Поки що наші порівняння складалися лише з кількох слів. Використовуючи difflib модуль Python також пропонує спосіб порівняння багаторядкових рядків і цілих списків слів. Вивід можна налаштувати відповідно до різних форматів інструментів розрізнення.

Наступний приклад (Лістинг 5) порівнює два багаторядкові рядки рядок за рядком і показує видалення, а також додавання. Після ініціалізації Differ об'єкт у рядку 12 порівняння здійснюється за допомогою compare() метод у рядку 15. Результат виводиться на стандартний вивід:


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))

Запуск сценарію створює результат, як показано нижче. Рядки з видаленнями позначені - знаки, тоді як рядки з додатками починаються з a + знак. Крім того, рядки зі змінами починаються зі знака питання. Зміни позначаються за допомогою ^ знаки на відповідній позиції. Рядки без індикатора залишаються такими ж:

$ 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.

Висновок

У цій статті ви дізналися про різні способи порівняння рядків у Python. Ми сподіваємося, що цей огляд допоможе вам ефективно програмувати в житті вашого розробника.

Подяки

Автор хотів би подякувати Менді Ноймаєр за підтримку під час підготовки статті.

Часова мітка:

Більше від Stackabuse