Сравнение строк с использованием 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 это очень удобно. Ряд примеров поможет вам понять, как их использовать.

Сравните строки с помощью операторов == и !=

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

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

Листинг 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.

Имейте в виду, что порядок чувствителен к регистру. Например, в латинском алфавите слово «автобус» стоит перед словом «автобус». Листинг 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")

Вывод выглядит следующим образом и соответствует «Бэйсуотер», «Тейбл Бэй» и «Бомбей» из списка мест:

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

Запуск сценария создает выходные данные, как показано ниже. Строки с удалениями обозначены значком - знаки, тогда как строки с дополнениями начинаются с + знак. Кроме того, строки с изменениями начинаются со знака вопроса. Изменения обозначаются с помощью ^ знаки в соответствующем положении. Линии без индикатора остаются прежними:

$ 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. Мы надеемся, что этот обзор поможет вам эффективно программировать в жизни вашего разработчика.

Благодарности

Автор хотел бы поблагодарить Мэнди Ноймайер за поддержку при подготовке статьи.

Отметка времени:

Больше от Стекабьюс