Автор оригинала: Frank Hofmann.
Сравнение строк с помощью Python
В Python строки-это последовательности символов, которые эффективно хранятся в памяти как объект. Каждый объект может быть идентифицирован с помощью метода id ()
, как вы можете видеть ниже. Python пытается повторно использовать объекты в памяти, которые имеют одно и то же значение, что также делает сравнение объектов очень быстрым в Python:
$ python Python 2.7.9 (default, Jun 29 2016, 13:08:31) [GCC 4.9.2] on linux2 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
строка, содержащая название швейцарского города “Лозанна”, сравнивается с записью из списка других мест, и результат сравнения выводится на stdout.
Листинг 1:
# define strings listOfPlaces = ["Berlin", "Paris", "Lausanne"] currentCity = "Lausanne" for place in listOfPlaces: print ("comparing %s with %s: %s" % (place, currentCity, place == currentCity))
Запуск скрипта Python сверху выводится следующим образом:
$ python3 comparing-strings.py comparing Berlin with Lausanne: False comparing Paris with Lausanne: False comparing Lausanne with Lausanne: True
Операторы ис
В Python есть два оператора сравнения ==
и is
. На первый взгляд они кажутся одинаковыми, но на самом деле это не так. ==
сравнивает две переменные на основе их фактического значения. Напротив, оператор is
сравнивает две переменные на основе идентификатора объекта и возвращает True
, если две переменные относятся к одному и тому же объекту.
Следующий пример демонстрирует это для трех переменных с целочисленными значениями. Две переменные a
и b
имеют одно и то же значение, и Python ссылается на один и тот же объект, чтобы минимизировать использование памяти.
>>> a = 1 >>> b = 1 >>> c = 2 >>> a is b True >>> a is c False >>> id(a) 10771520 >>> id(b) 10771520
Как только значение изменится, Python восстановит объект и назначит переменную. В следующем фрагменте кода b
получает значение 2, а затем b
и c
ссылаются на один и тот же объект.
>>> b = 2 >>> id(b) 10771552 >>> id(c) 10771552
Эмпирическое правило, которому следует следовать, состоит в том, чтобы использовать ==
при сравнении неизменяемых типов (например, ints) и is
при сравнении объектов.
Дополнительные Операторы Сравнения
Для сравнения относительно лексикографического порядка можно использовать операторы сравнения <
, >
, <=
, и >=
. Само сравнение производится по характеру. Порядок зависит от порядка символов в алфавите. Этот порядок зависит от таблицы символов, используемой на вашем компьютере при выполнении кода Python.
Имейте в виду, что порядок чувствителен к регистру. В качестве примера для латинского алфавита слово “Автобус” стоит перед словом “автобус”. Листинг 2 показывает, как эти операторы сравнения работают на практике.
Листинг 2:
# define the strings listOfPlaces = ["Berlin", "Paris", "Lausanne"] currentCity = "Lausanne" for place in listOfPlaces: if place < currentCity: print ("%s comes before %s" % (place, currentCity)) elif place > currentCity: print ("%s comes after %s" % (place, currentCity)) else: print ("%s is similar to %s" % (place, currentCity))
Запуск скрипта Python сверху выводится следующим образом:
$ python3 comparing-strings-order.py Berlin comes before Lausanne Paris comes after Lausanne Lausanne is similar to Lausanne
Сравнение Без Учета Регистра
Предыдущие примеры были сосредоточены на точном совпадении строк. Чтобы разрешить сравнение без учета регистра, Python предлагает специальные строковые методы, такие как upper()
и lower()
. Оба они непосредственно доступны как методы соответствующего строкового объекта.
upper()
преобразует всю строку в заглавные буквы, а lower ()
– в строчные соответственно. На основе Листинга 1 в следующем листинге показано, как использовать метод lower ()
.
Листинг 3:
# using the == operator listOfPlaces = ["Berlin", "Paris", "Lausanne"] currentCity = "lausANne" for place in listOfPlaces: print ("comparing %s with %s: %s" % (place, currentCity, place.lower() == currentCity.lower()))
Результат выглядит следующим образом:
$ python3 comparing-strings-case-insensitive.py comparing Berlin with lausANne: False comparing Paris with lausANne: False comparing Lausanne with lausANne: True
Использование регулярного выражения
Регулярное выражение – или сокращенно “регулярное выражение” – определяет определенный набор символов. Что касается этой темы, Джеффри Фридл написал отличную книгу под названием Овладение регулярными выражениями , которую я бы очень рекомендовал.
Чтобы использовать этот механизм в Python, сначала импортируйте модуль re , а затем определите конкретный шаблон. Опять же, следующий пример основан на Листинге 1 . Шаблон поиска соответствует “заливу” и начинается либо со строчной, либо с прописной буквы. Именно, следующий код Python находит все строки, в которых встречается шаблон поиска, независимо от того, в какой позиции строки – в начале, или в середине, или в конце.
Листинг 4:
# import the additional module import re # define list of places listOfPlaces = ["Bayswater", "Table Bay", "Bejing", "Bombay"] # define search string pattern = re.compile("[Bb]ay") for place in listOfPlaces: if pattern.search(place): print ("%s matches the search pattern" % place)
Вывод выглядит следующим образом и соответствует “Бейсуотеру”, “Столовому заливу” и “Бомбею” из списка мест:
$ python3 comparing-strings-re.py Bayswater matches the search pattern Table Bay matches the search pattern Bombay matches the search pattern
Многострочные и листовые сравнения
До сих пор наши сравнения сводились лишь к нескольким словам. Используя модуль difflib
Python также предлагает способ сравнения многострочных строк и целых списков слов. Выход может быть сконфигурирован в соответствии с различными форматами инструментов diff.
Следующий пример ( Листинг 5 ) сравнивает две многострочные строки строка за строкой и показывает удаление, а также добавление. После инициализации объекта Differ
в строке 12 сравнение производится с помощью метода compare()
в строке 15. Результат печатается на stdout (строка 18).
Листинг 5:
# import the additional module import difflib # define original text # taken from: https://en.wikipedia.org/wiki/Internet_Information_Services 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."] # define modified text edited = ["About the IIS", "", "It has several improvements related", "to performance in large-scale scenarios."] # initiate the Differ object d = difflib.Differ() # calculate the difference between the two texts diff = d.compare(original, edited) # output the result 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. Мы надеемся, что этот обзор поможет вам эффективно программировать в жизни вашего разработчика.
Признание
Автор хотел бы поблагодарить Мэнди Ноймайер за ее поддержку при подготовке статьи.