Библиотека string в Python: работа со строками и шаблонами
Работа со строками с помощью модуля string
Как безопасно подставлять значения в строку, избегая уязвимостей, и управлять форматированием?
Наиболее эффективным способом является использование класса string.Template. Он подставляет значения по имени переменной, что предотвращает внедрение кода при работе с пользовательским вводом.
from string import Template
t = Template('Здравствуйте, $name! Ваш заказ №$order.')
result = t.substitute(name='Иван', order='12345')
print(result)Python strip (метод strip в python)
Здравствуйте, Иван! Ваш заказ №12345.
Python повторить строку (повторение строки в python)
Метод substitute вызывает ошибку, если не хватает ключа. Для пропуска отсутствующих ключей используется safe_substitute.
Типичная ошибка: забыть указать $ перед именем переменной или использовать фигурные скобки для однозначного выделения имени: ${name}адрес. Если имя переменной сразу после $ граничит с буквами, шаблон может не сработать.
Как проверить, является ли символ буквой, цифрой или знаком пунктуации?
Модуль string предоставляет константы: ascii_letters, digits, punctuation. Это удобно для фильтрации или валидации строк.
import string
symbol = '@'
if symbol in string.punctuation:
print(f'{symbol} - знак пунктуации')
Tuple в str python (преобразование кортежа в строку в python)
@ - знак пунктуации
Python объект в строку (преобразование объекта в строку в python)
Проблема: константы не учитывают локаль. Для работы с буквами кириллицы понадобится string.printable или собственные множества.
Как привести первую букву каждого слова к верхнему регистру, сохраняя остальные?
Функция string.capwords разбивает строку по пробельным символам, применяет capitalize() к каждому слову и соединяет обратно.
import string
text = 'привет мир! как дела?'
result = string.capwords(text)
print(result)Python convert string (преобразование строк в python)
Привет Мир! Как Дела?
Python str to bytes (преобразование строки в байты в python)
Обратите внимание: функция удаляет лишние пробелы и не меняет регистр букв после первой.
Если нужно сохранить оригинальное количество пробелов или обрабатывать нестандартные разделители, capwords не подходит. Для таких случаев следует использовать регулярные выражения.
Как гибко настраивать форматирование строк с произвольными правилами?
Класс string.Formatter позволяет переопределить методы format_field, get_value и другие для создания своего синтаксиса.
from string import Formatter
class MyFormatter(Formatter):
def format_field(self, value, format_spec):
if format_spec == 'upper':
return str(value).upper()
return super().format_field(value, format_spec)
fmt = MyFormatter()
result = fmt.format('{name:upper} {age}', name='анна', age=25)
print(result)функция разделить python (разделение строки на список в python)
АННА 25
Это полезно для реализации предметно-ориентированных языков или шаблонизаторов.
Сложность: требуется глубокое понимание механики Formatter. Ошибка в переопределённом методе может привести к неожиданным падениям.
Для большинства повседневных задач достаточно Template и констант string. Расширенные возможности Formatter используют при создании библиотек и фреймворков.
Расширенные примеры использования библиотеки string
Ниже приведены нетривиальные сценарии, демонстрирующие возможности модуля string.
# 1. Генерация случайного пароля с использованием констант
import string
import random
def generate_password(length=12):
# Используем буквы, цифры и знаки пунктуации, но исключаем спорные символы
chars = string.ascii_letters + string.digits + string.punctuation
# Удаляем символы, которые легко спутать (например, '0', 'O', 'l', 'I')
ambiguous = '0O1lI'
chars = ''.join(c for c in chars if c not in ambiguous)
password = ''.join(random.choice(chars) for _ in range(length))
return password
print(generate_password(16))
jT]Zx*Y8k&:f2pcE
# 2. Использование Template с безопасной подстановкой и словарём
from string import Template
tpl = Template('$name работает в $company')
data = {'name': 'Анна', 'company': 'Python Software Foundation'}
print(tpl.substitute(data))
Анна работает в Python Software Foundation
# 3. Настраиваемый форматтер для вывода чисел
from string import Formatter
class NumberFormatter(Formatter):
def format_field(self, value, format_spec):
if format_spec == 'rub':
return f'{value:.2f} ₽'
elif format_spec == 'percent':
return f'{value*100:.1f}%'
return super().format_field(value, format_spec)
fmt = NumberFormatter()
print(fmt.format('Стоимость: {price:rub}, скидка: {discount:percent}', price=1234.5, discount=0.15))
Стоимость: 1234.50 ₽, скидка: 15.0%
# 4. Фильтрация строк с использованием string.whitespace
import string
def strip_all_whitespace(text):
"""Удаляем все пробельные символы, включая табуляции и переносы"""
return ''.join(c for c in text if c not in string.whitespace)
sample = 'Привет,\tмир!\nНовая строка.'
print(strip_all_whitespace(sample))
Привет,мир!Новаястрока.
# 5. Собственный шаблон с наследованием от Template
from string import Template
class ShellTemplate(Template):
delimiter = '%' # меняем символ-разделитель
t = ShellTemplate('Hello %{name}, your path is %{path}')
print(t.substitute(name='root', path='/home'))
Hello root, your path is /home
Эти примеры демонстрируют гибкость модуля string: от генерации случайных наборов до создания DSL для форматирования.