Рубрики
Без рубрики

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

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

Признание

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