Это старая версия документа!
Работа со строками
Строки в Python хранятся в Unicode.
В Python нет отдельного типа для одного символа. Символ это str
длинной 1.
Индексация
str
индексируются как перечисляемые типы. К ним можно применять срезы и итерировать по символам.
s = "привет"
s[1] == "p" # True
for ss in s:
print(ss)
Изменение
str
нельзя изменить.
s = "привет"
s[1] = "Ф" # Ошибка
Чтобы изменить строку надо создать новую из старой или превратить ее в список.
s = "привет"
s = s[0:1] + "Ф" + s[2:] # Успешно
s = "привет"
vs = list(s)
vs[1] = "Ф"
s = ''.join(vs) # Успешно
Некоторые методы
find
Поиск подстроки
s = "hello world"
x = s.find("world") # x == 6
x = s.find("code") # x == -1
startswith и endswith
Проверка, что строка начинается или заканчивается на подстроку
s = "hello world"
x = s.startswith("hello") # x == True
x = s.endswith("code") # x == False
+
Конкатенация строк
a = "hello"
b = "world"
c = a + " " + b #c == "hello world"
split
Разбивает строку на список строк с использованием разделителя (по умолчанию пробел)
s = "goodbye|blue|sky"
d = s.split("|") # d == ['goodbye', 'blue', 'sky']
join
Собирает строку из списка строк с использованием разделителя
jp = ["goodbye", "blue", "sky"]
sep = "_"
s = sep.join(jp) # s == "goodbye_blue_sky"
strip
Удаляет из начала и конца строки пробельные символы
s = "\t goodbye blue sky \n \n"
d = s.strip() # d == "goodbye blue sky"
replace
Выполняет замену в строке
s = "goodbye blue sky"
d = s.replace("blue", "red") # d == "goodbye red sky"
encode и decode
Превращают str
в bytes
и обратно в заданной кодировке (по умолчанию utf8
)
s = "привет мир"
d = s.encode("cp866")
# d == b'\xaf\xe0\xa8\xa2\xa5\xe2 \xac\xa8\xe0'
q = d.decode("cp866")
# q == "привет мир"
ljust и rjust
Догоняет строку заданным символом до нужной длинны.
s = "привет мир"
w = s.ljust(15,"_")
# w == 'привет мир_____'
q = s.rjust(15,"_")
# q == '_____привет мир'
Формирование строк в стиле printf
У типа str
предусмотрен оператор %
который принимает вторым аргументом переменную или кортеж и подставляет их на указанное место в строке.
t = "привет %s : %.2f"
s = t % ("мир", 42)
# s == 'привет мир : 42.00'
Популярные форматы
Формат | Аргумент | Эффект |
---|---|---|
%s | str | Подстановка строки |
%d | int | Подстановка целого числа |
%f | float | Подстановка числа с плавающей точкой |
%e | float | Экспоненциальный формат |
%x | int | Подстановка числа в шестнадцатеричной системе |
Популярные модификаторы
"%6d" % 42 # ' 42'
"%06d" % 42 # '000042'
"%.2f" % 3.14159 # '3.14'
"%06.2f" % 3.14159 # '003.14'
"%#6.2f" % 3.14159 # ' 3.14'
"%+6.3f" % 3.14159 # '+3.142'
Формирование строк в стиле format
У типа str
есть специальный метод format
:
s = 'Привет, {}!'
w = s.format('мир')
#w == 'Привет, мир!'
Преимущества:
- Автоматическое приведение типов
- Возможность передачи параметров по имени и по номеру (в том числе повторение)
Форматы аналогичны %
но указываются после символа :
перед которым может стоять имя аргумента:
s = 'Power {power:.2f} State {state}'
w = s.format(state = "Ready", power = 3.14159)
#w == 'Power 3.14 State Ready'
Разбор строк
Базовые разбор строк часто можно выполнить комбинацией методов 'split', 'strip' и приведением полученных элементов строки к нужным типам. Но иногда этого бывает мало или получаемый код выходит слишком громоздким.
scanf
Пакет scanf
[pip] предоставляет метод разбора строк аналогичный C функции scanf
.
from scanf import scanf
template = 'Power: %f [%], %s, Stemp: %f'
text = 'Power: 0.0 [%], Cool, Stemp: 23.73'
s = scanf(template, text)
#s == (0.0, 'Cool', 23.73)
Поддерживаемые модификаторы: ширина поля %12d
и пропуск поля %*d
.
Дополнительно имеется тип %c
— один или нескольких символов, например %12c
, а %s
работает до первого пробела.
Подробное описание форматов scanf.
Регулярные выражения
Регулярные выражения — специальный язык программирования. В стандартной библиотеке Python есть модуль для работы с ними — re
. Перед использованием регулярные выражения следует компилировать методом re.compile
, это повышает производительность.
Основные применения:
- Проверка формальной корректности строки
- Поиск/замена по шаблону
- Разделение строки по правилам
Проверить свои регулярные выражения можно, например, на сайте http://www.pyregex.com/.
Использование длинных и сложных регулярных выражений считается плохим стилем. Для разбора сложного синтаксиса следует использовать другие инструменты.
Некоторые популярные регулярные выражения
Выражение | Смысл |
---|---|
^ | Начало строки |
$ | Конец строки |
. | Один любой символ |
[abcd] | Один из символов abcd |
[a-z0-9A-Z] | Один из алфовитноцифровых символов |
\w | Один символ из набора [a-zA-Z0-9_] + Unicode letters |
\s | Один пробельный символ |
( ) | Группа из одного или нескольких шаблонов к которой можно обращаться |
+ | Модификатор «один или несколько» |
* | Модификатор «ноль или несколько» |
Чтобы избежать проблем с экранированием регулярные выражения записываются, как строки без экранирования, например r'\w+
'.
Некоторые методы
match
Проверка на соответствие строки — шаблону.
import re
r = re.compile(r"\w+ = \w+")
r.match("Привет = мир") != None # True
r.match("Привет =") != None # False
r.match("Привет = мир проверка") != None # True
r = re.compile(r"^\w+\s+=\s+\w+$")
r.match("Привет = мир проверка") != None # False
r.match("Привет = мир\n") != None # True
r = re.compile(r"^(\w+)\s+=\s+(\w+)$")
wd = r.match("Привет = мир")
wd.group(0) # 'Привет = мир'
wd.group(1) # 'Привет'
wd.group(2) # 'мир'
search / findall
Поиск в строке подстрок(-и) удовлетворяющей выражению.
import re
r = re.compile(r"[а-я]+")
wd = r.search("Если я чешу в затылке не беда!")
s = wd.group(0) # s == 'сли'
t = r.findall("Если я чешу в затылке не беда!")
#t == ['сли', 'я', 'чешу', 'в', 'затылке', 'не', 'беда']
sub
Замена подстрок(-и) удовлетворяющей выражению.
import re
r = re.compile(r"\s+")
s = r.sub("-","begin begin begin end end end")
# s == 'begin-begin-begin-end-end-end'
split
Разбиение строки по разделителю в виде регулярного выражения.
import re
r = re.compile(r"\s+")
s = r.split("Если я чешу в затылке не беда!")
# s == ['Если', 'я', 'чешу', 'в', 'затылке', 'не', 'беда!']