Модуль string: практическое руководство по константам и форматированию строк

Раздел: Основы Python -> Работа с модулями

Модуль 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%)

Модуль string в Python - comments

En
Python string module (python)