Строки и функции для работы с ними
Строки и функции для работы с ними

Строки и функции для работы с ними (faq)

Строки в языке программирования Python – это объекты, которые состоят из последовательности символов. Наравне с bool, int и прочих, работа со строковым типом данных является неотъемлемой частью программирования, так как очень редко встречаются приложения, в которых не используется текст.

Вводная информация о строках

Как и во многих других языках программирования, в Python есть большая коллекция функций, операторов и методов, позволяющих работать со строковым типом.

Что представляют собой строки в Python

С точки зрения Питона, строка – это упорядоченная последовательность символов, которая предназначена для хранения информации в виде простого текста.

Поэтому тип данных string используется в случае, когда что-то нужно представить в текстовой форме.

Литералы строк

Литерал – способ создания объектов, в случае строк Питон предлагает несколько основных вариантов:

>>> 'string' # одинарные кавычки 'string' >>> "string" # двойные кавычки 'string' >>> """string""" 'string' >>> '''string''' 'string'

Если внутри строки необходимо расположить двойные кавычки, и сама строка была создана с помощью двойных кавычек, можно сделать следующее:

>>> 'book "war and peace"' # разный тип кавычек 'book "war and peace"' >>> "book 'war and peace'" # разный тип кавычек "book 'war and peace'" >>> "book \"war and peace\"" # экранирование кавычек одного типа 'book "war and peace"' >>> 'book \'war and peace\'' # экранирование кавычек одного типа "book 'war and peace'"
💡 Разницы между строками с одинарными и двойными кавычками нет – это одно и то же

Какие кавычки использовать – решать вам, соглашение PEP 8 не дает рекомендаций по использованию кавычек. Просто выберите один тип кавычек и придерживайтесь его. Однако если в стоке используются те же кавычки, что и в литерале строки, используйте разные типы кавычек – обратная косая черта в строке ухудшает читаемость кода.

Кодировка строк

В третьей версии языка программирования Python все строки представляют собой последовательность Unicode-символов.

В Python 3 кодировка по умолчанию исходного кода – UTF-8. Во второй версии по умолчанию использовалась ASCII. Если необходимо использовать другую кодировку, можно разместить специальное объявление на первой строке файла, к примеру:

# -*- coding: windows-1252 -*-

Максимальная длина строки в Python

Максимальная длина строки зависит от платформы. Обычно это:

  • 2**31 - 1 – для 32-битной платформы;
  • 2**63 - 1 – для 64-битной платформы;

Константа maxsize , определенная в модуле sys :

>>> import sys >>> sys.maxsize 2147483647

Перенос строк

Перенос строки осуществляется с помощью символа \n :

>>> text = "one\ntwo\nthree" >>> print(text) one two three

Конкатенация строк

Одна из самых распространенных операций со строками – их объединение (конкатенация). Для этого используется знак + , в результате к концу первой строки будет дописана вторая:

>>> s1 = "Hello" + " world" >>> s2 = " world" >>> s1+s2 'Hello world'

При необходимости объединения строки с числом его предварительно нужно привести тоже к строке, используя функцию str() :

>>> name = "John" >>> age = 30 >>> "Name: " + name + ", age: " + str(age) 'Name: John, age: 30'

Сравнение строк

При сравнении нескольких строк рассматриваются отдельные символы и их регистр:

  • цифра условно меньше, чем любая буква из алфавита;
  • алфавитная буква в верхнем регистре меньше, чем буква в нижнем регистре;
  • чем раньше буква в алфавите, тем она меньше;

При этом сравниваются по очереди первые символы, затем – 2-е и так далее.

>>> s1 = "1a" >>> s2 = "aa" >>> s3 = "Aa" >>> s4 = "ba" >>> "1a" > "aa" # сравнение цифры с буквой False >>> "aa" > "Aa" # сравнение регистров True >>> "aa" > "ba" # сравнение букв по алфавитному порядку False >>> "aa" < "az" # первые буквы одинаковые, сравниваются следующие две True

Далеко не всегда желательной является зависимость от регистра, в таком случае можно привести обе строки к одному и тому же регистру. Для этого используются функции lower() – для приведения к нижнему и upper() – к верхнему:

>>> s1 = "Intel" >>> s2 = "intel" >>> s1 == s2 False >>> s1.lower() == s2.lower() True

Пустая строка Python

Объявить пустую строку можно следующими способами:

>>> "" '' >>> '' '' >>> str() ''

Как удалить строку в Python

Строки, как и некоторые другие типы данных в языке Python, являются неизменяемыми объектами. При задании нового значения строке просто создается новая, с заданным значением. Для удаления строки можно воспользоваться методом replace() , заменив ее на пустую строку:

>>> s = "test" >>> s.replace("test", "") ''

Или перезаписать переменную пустой строкой:

>>> s = "test" >>> s = "" >>> s ''

Обращение по индексу

Для выбора определенного символа из строки можно воспользоваться обращением по индексу, записав его в квадратных скобках:

>>> s = "abcdef" >>> s[0] 'a' >>> s[2] 'c'Индекс начинается с 0

В Python предусмотрена возможность получить доступ и по отрицательному индексу. В таком случае отсчет будет вестись от конца строки:

>>> s = "abcdef" >>> s[-1] 'f'

Форматирование строк

Часто возникает ситуация, когда необходимо создать строку, подставив в нее определенные значения, полученные во время выполнения программы. Подстановка данных в таком случае выполняется при помощи форматирования строк, сделать это можно несколькими способами.

Оператор %

Строки в Python обладают встроенной операцией, к которой можно получить доступ оператором %, что дает возможность очень просто делать форматирование. Самый простой пример – когда для подстановки нужен только один аргумент, значением будет он сам:

>>> name = "Alex" >>> 'Hello, %s' % name 'Hello, Alex'

Если же для подстановки используется несколько аргументов, то значением будет кортеж со строками:

>>> '%d %s, %d %s' % (6, 'bananas', 10, 'lemons') '6 bananas, 10 lemons'

Как видно из предыдущего примера, зависимо от типа данных для подстановки и того, что требуется получить в итоге, пишется разный формат. Наиболее часто используются:

  1. '%d', '%i', '%u – десятичное число;
  2. '%c' – символ, точнее строка из одного символа или число – код символа;
  3. '%r' – строка (литерал Python);
  4. '%s' – строка.

Такой способ форматирования строк называет "старым" стилем, который в Python 3 был заменен на более удобные способы.

str.format()

В Python 3 появился более новый метод форматирования строк, который вскоре перенесли и в Python 2.7. Такой способ избавляет программиста от специального синтаксиса %-оператора. Делается все путем вызова .format() для строковой переменной. С помощью специального символа – фигурных скобок – указывается место для подстановки значения, каждая пара скобок указывает отдельное место для подстановки, значения могут быть разного типа:

>>> print('{}'.format(100)) 100 >>> '{0}, {1}, {2}'.format('one', 'two', 'three') 'one, two, three' >>> '{2}, {1}, {0}'.format('one', 'two', 'three') 'three, two, one'

💭 В Python 3 форматирование строк с использованием "нового стиля" является более предпочтительным по сравнению с использованием %-стиля, так как предоставляет более широкие возможности, не усложняя простые варианты использования.

f-строки (Python 3.6+)

В Python версии 3.6 появился новый метод форматирования строк – "f-строки", с его помощью можно использовать встроенные выражения внутри строк:

>>> name = 'Alex' >>> f'Hello, {name}!' 'Hello, Alex!'

Такой способ форматирования очень мощный, так как дает возможность встраивать выражения:

>>> a = 5 >>> b = 10 >>> f'Five plus ten is {a + b} and not {2 * (a + b)}.' 'Five plus ten is 15 and not 30.'

Таким образом, форматирование с помощью f-строк напоминает использование метода format(), но более гибкое, быстрое и читабельное.

Стандартная библиотека Template Strings

Еще один способ форматирования строк, который появился еще с выходом Python версии 2.4, но так и не стал популярным – использование библиотеки Template Strings. Есть поддержка передачи значения по имени, используется $-синтаксис как в языке PHP:

>>> from string import Template >>> name = "Alex" >>> age = 30 >>> s = Template('My name is $name. I’m $age.') >>> print(s.substitute(name=name, age=age)) My name is Alex. I'm 30

Функции для работы со строками

Для работы со строками в Питоне предусмотрены специальные функции. Рассмотрим их:

Преобразование числового или другого типа к строке:

  • str(n) – преобразование числового или другого типа к строке;
  • len(s) – длина строки;
  • chr(s) – получение символа по его коду ASCII;
  • ord(s) – получение кода ASCII по символу;

Методы для работы со строками

Кроме функций, для работы со строками есть немало методов:

  • find(s, start, end) – возвращает индекс первого вхождения подстроки в s или -1 при отсутствии. Поиск идет в границах от start до end ;
  • rfind(s, start, end) – аналогично, но возвращает индекс последнего вхождения;
  • replace(s, new) – меняет последовательность символов s на новую подстроку new ;
  • split(x) – разбивает строку на подстроки при помощи выбранного разделителя x;
  • join(x) – соединяет строки в одну при помощи выбранного разделителя x;
  • strip(s) – убирает пробелы с обеих сторон;
  • lstrip(s), rstrip(s) – убирает пробелы только слева или справа;
  • lower() – перевод всех символов в нижний регистр;
  • upper() – перевод всех символов в верхний регистр;
  • capitalize() – перевод первой буквы в верхний регистр, остальных – в нижний.

👉 Примеры использования:

>>> text = "Wikipedia is a Python library that makes it easy to access and parse data from Wikipedia" >>> text.find("Wikipedia") 0 >>> text.rfind("Wikipedia") 79 >>> text.replace("from Wikipedia", "from https://www.wikipedia.org/") 'Wikipedia is a Python library that makes it easy to access and parse data from https://www.wikipedia.org/' >>> text.split(" ") ['Wikipedia', 'is', 'a', 'Python', 'library', 'that', 'makes', 'it', 'easy', 'to', 'access', 'and', 'parse', 'data', 'from', 'Wikipedia'] split_text = text.split(" ") >>> "_".join(split_text) 'Wikipedia_is_a_Python_library_that_makes_it_easy_to_access_and_parse_data_from_Wikipedia' >>> text = " test " >>> text.strip() 'test' >>> text.lstrip() 'test ' >>> text.rstrip() ' test' >>> text = "Python is a product of the Python Software Foundation" >>> text.lower() 'python is a product of the python software foundation' >>> text.upper() 'PYTHON IS A PRODUCT OF THE PYTHON SOFTWARE FOUNDATION' >>> text = "python is a product of the python software foundation" >>> text.capitalize() 'Python is a product of the python software foundation'

Преобразование из строки в другой тип

В Питоне строки можно преобразовывать в другие типы данных:

string to int

Функция int() преобразовывает целое число в десятичной системе, заданное как строка, в тип int:

>>> int("10") 10

При необходимости можно указывать систему счисления:

>>> int("0x12F", base=16) 303

string to list

Самый простой способ преобразования строки в список строк – метод split():

>>> 'one two three four'.split() ['one', 'two', 'three', 'four']

При необходимости можно указывать разделитель:

>>> 'one, two, three, four'.split(',') ['one', ' two', ' three', ' four']

string to bytes

Преобразование строкового типа в байтовый выполняется функцией encode() с указанием кодировки:

>>> 'Байты'.encode('utf-8') b'\xd0\x91\xd0\xb0\xd0\xb9\xd1\x82\xd1\x8b'

string to datetime

Строка в дату преобразовывается функцией strptime() из стандартного модуля datetime:

>>> from datetime import datetime >>> print(datetime.strptime('Jan 1 2020 1:33PM', '%b %d %Y %I:%M%p')) 2020-01-01 13:33:00

string to float

Для преобразования строки в число с плавающей точкой используется стандартная функция float:

>>> float('1.5') 1.5

string to dict

Создание словаря из строки возможно, если внутри нее данные в формате json. Для этого можно воспользоваться модулем json :

>>> import json >>> print(json.loads('{"Russia": "Moscow", "France": "Paris"}')) {'Russia': 'Moscow', 'France': 'Paris'}

string to json

Конвертация объектов Python в объект json выполняется функцией dumps():

>>> import json >>> json.dumps("hello") '"hello"'

Best practices

Как разбить строку на символы

Разбиение строки на отдельные символы выполняется несколькими способами:

>>> text = "django" # вариант 1 >>> list(text) ['d', 'j', 'a', 'n', 'g', 'o'] # вариант 2 >>> [c for c in "text"] ['t', 'e', 'x', 't'] # вариант 3 >>> for c in text: print(c) d j a n g o

Как из строки выделить числа

Для извлечения чисел из строки можно воспользоваться методами строк:

>>> str = "h3110 23 cat 444.4 rabbit 11 2 dog" >>> [int(s) for s in str.split() if s.isdigit()] [23, 11, 2]

Данный пример извлекает только целые положительные числа. Более универсальный вариант – регулярные выражения:

>>> str = "h3110 23 cat 444.4 rabbit 11 2 dog" >>> import re >>> re.findall(r'\d+', str) ['3110', '23', '444', '4', '11', '2']

Как перевернуть строку

Существует несколько способов перевернуть строку, начиная от классического – запустить цикл в обратной последовательности, выбирая каждый символ с конца и вставляя его в новую строку, и заканчивая срезами – вариант только для Питона.

С помощью среза – самый быстрый способ:

>>> 'test'[::-1] 'tset'

Использование reversed() и str.join() :

>>> ''.join(reversed('test')) 'tset'

Как удалить последний символ в строке

Как и в предыдущем случае – чтобы убрать последний символ наиболее простым и быстрым вариантом будет использование среза:

>>> "Some text1"[:-1] 'Some text'

Как убрать пробелы из строки

В случае удаления пробелов со строки может быть два варианта:

1. Обрезать строку так, чтобы удалить с нее первый и последний пробел, такой вариант может пригодиться, когда пользователь случайно поставит пробел в конце введенного текста:

>>> " Some text ".strip() 'Some text'

2. Удалить со строки все пробелы:

>>> " So me t e x t ".replace(' ', '') 'Sometext'

Работа со строками – неотъемлемая часть создания практически любого приложения, где используется текст, и язык программирования Python предоставляет широкие возможности работы с такими данными.

😭
😕
😃
😍