Модуль string: практическое руководство по константам и форматированию строк
Модуль string: базовые константы и шаблоны
Модуль string предоставляет набор полезных констант (наборы символов) и классы для форматирования строк. Его основное назначение - упростить типовые операции: проверку символов, безопасную подстановку значений и кастомное форматирование.
Как безопасно подставить значения в строку, избегая ошибок форматирования?
Наиболее эффективным решением является использование класса string.Template. Он позволяет задавать шаблон с плейсхолдерами $идентификатор или ${идентификатор} и заменять их с помощью методов substitute (вызывает исключение, если ключ отсутствует) или safe_substitute (пропускает отсутствующие ключи). Такой подход устраняет уязвимости, связанные с инъекцией кода при форматировании через % или .format().
from string import Template
t = Template('Здравствуйте, $name! Ваш баланс: ${balance} руб.')
message = t.substitute(name='Иван', balance='1500')
print(message)Python module attributes (атрибуты модуля в python)
Здравствуйте, Иван! Ваш баланс: 1500 руб.
Python module version (версия модуля python)
Проблема: при использовании substitute с несуществующим ключом возникает KeyError. Решение: если не все ключи гарантированно переданы, применяйте safe_substitute, который оставляет незаменённые плейсхолдеры без изменений.
t = Template('$a и $b')
print(t.safe_substitute(a='1')) # $b останетсяPython cpp module (взаимодействие python с модулями c++)
1 и $b
Python module cv2 (модуль cv2 (opencv) в python)
Как проверить, состоит ли строка только из букв или цифр?
Для этого используются константы string.ascii_letters, string.digits и их комбинации. Подход эффективен при написании валидаторов, когда не хочется подключать регуляные выражения.
import string
def is_alphanumeric(s):
allowed = string.ascii_letters + string.digits
return all(ch in allowed for ch in s)
print(is_alphanumeric('Test123'))
print(is_alphanumeric('Hello!'))Python encodings module (модуль encodings в python)
True False
Platform module python (модуль platform в python)
Ошибка: путаница между ascii_letters (только английские буквы) и letters (зависит от локали). Для работы с кириллицей эта константа не подходит; нужно использовать str.isalpha() или вручную задать алфавит.
Как преобразовать строку в формат «Заглавная Буква Каждого Слова»?
Функция string.capwords разбивает строку по пробелам, делает первую букву каждого слова заглавной, остальные - строчными, и соединяет обратно. Это проще, чем ручное применение str.capitalize() ко всем словам.
import string
text = 'приВЕТ, КАК ДЕЛА?'
result = string.capwords(text)
print(result)Python string module (модуль string в python)
Привет, Как Дела?
Module sys python (модуль sys в python)
Как изменить разделитель слов? По умолчанию capwords использует пробелы. Можно передать второй аргумент - строку-разделитель, по которой будет производиться split.
result2 = string.capwords('one-two-three', sep='-')
print(result2)Python tkinter module (модуль tkinter в python)
One-Two-Three
Python types module (модуль types в python)
Как удалить из строки все непечатаемые символы?
Константа string.printable содержит все печатаемые символы ASCII, включая пробелы, цифры, буквы и знаки препинания. С её помощью можно отфильтровать строку, оставив только допустимые символы.
import string
def clean_printable(s):
return ''.join(ch for ch in s if ch in string.printable)
text_with_control = 'Hello\x00World\x1b'
print(clean_printable(text_with_control))Python typing module (модуль typing в python)
HelloWorld
Python module windows (модуль windows для python)
Ошибка: string.printable включает символы табуляции и перевода строки. Если их тоже нужно удалять, придётся дополнительно исключать \t, \n и т.д.
Как создать собственный форматтер для строк?
Класс string.Formatter позволяет переопределить парсинг полей форматирования, преобразование типов и получение значений. Он используется редко, но даёт полный контроль над .format().
import string
class MyFormatter(string.Formatter):
def format_field(self, value, format_spec):
if format_spec == 'up':
return str(value).upper()
return super().format_field(value, format_spec)
fmt = MyFormatter()
print(fmt.format('Привет, {name:up}', name='мир'))Python module path (путь к модулю python)
Привет, МИР
Проблема: сложность отладки кастомных форматтеров. Рекомендуется использовать Template для простых подстановок и только при необходимости реализовывать Formatter.
Расширенные примеры работы с модулем string
Ниже приведены менее очевидные приёмы, которые пригодятся в реальных проектах.
Пример 1: Безопасная подстановка с шаблоном и проверкой типов
Используется Template вместе с safe_substitute и дополнительной фильтрацией. Позволяет частично заполнять шаблон и избегать исключений.
from string import Template
tmpl = Template('$name, ваш заказ №$order на сумму $price руб. готов.')
# Частичные данные
partial = tmpl.safe_substitute(name='Анна', price='2500')
print(partial)
# Полные данные
full = tmpl.substitute(name='Анна', order='12345', price='2500')
print(full)
Анна, ваш заказ №$order на сумму 2500 руб. готов. Анна, ваш заказ №12345 на сумму 2500 руб. готов.
Пример 2: Проверка пароля на наличие обязательных категорий символов
Константы string.ascii_lowercase, ascii_uppercase, digits, punctuation используются для проверки, что пароль содержит хотя бы один символ из каждой группы.
import string
def password_strength(password):
checks = {
'lower': any(ch in string.ascii_lowercase for ch in password),
'upper': any(ch in string.ascii_uppercase for ch in password),
'digit': any(ch in string.digits for ch in password),
'punct': any(ch in string.punctuation for ch in password)
}
return checks
print(password_strength('Aa1!'))
print(password_strength('weak'))
{'lower': True, 'upper': True, 'digit': True, 'punct': True}
{'lower': True, 'upper': False, 'digit': False, 'punct': False}
Пример 3: Очистка текста от управляющих символов с сохранением пробелов
Иногда нужно сохранить только видимые символы и обычные пробелы, но убрать управляющие (коды 0x00-0x1F, 0x7F). Используется string.printable за вычетом \t, \n, \r (если их тоже нужно удалить) или наоборот - string.whitespace.
import string
def clean_text(s):
# оставляем только символы из printable
allowed = set(string.printable)
# можно дополнительно убрать пробельные, если нужно
# allowed -= set(string.whitespace)
return ''.join(ch for ch in s if ch in allowed)
text = 'Line1\nLine2\tTab\x00Null'
print(repr(clean_text(text)))
'Line1\nLine2\tTabNull'
Пример 4: Разделение строки по символам пунктуации с помощью string.punctuation
Функция string.capwords использует пробел как разделитель. Но можно сделать свой токенизатор на основе punctuation.
import string
def split_by_punct(text):
words = []
current_word = []
for ch in text:
if ch in string.punctuation or ch in string.whitespace:
if current_word:
words.append(''.join(current_word))
current_word = []
else:
current_word.append(ch)
if current_word:
words.append(''.join(current_word))
return words
print(split_by_punct('Привет, мир! Как?..'))
['Привет', 'мир', 'Как']
Пример 5: Настройка Template с другим разделителем (редкий сценарий)
Класс Template можно наследовать и изменить delimiter. Это полезно, если в шаблоне часто встречается знак доллара.
from string import Template
class MyTemplate(Template):
delimiter = '#'
t = MyTemplate('Цена: #price руб. (скидка #discount%)')
print(t.substitute(price='1000', discount='10'))
Цена: 1000 руб. (скидка 10%)