Перейти к содержанию

textcase logo

textcase

Многофункциональная библиотека преобразования регистра текста в Python.

Coveralls PyPI - Version PyPI - Downloads PyPI - Python Version

Особенности#

  • 🔥 Преобразование регистра текста: преобразуйте строки между различными регистрами текста (например, snake_case, kebab-case, camelCase и т.д.).
  • 🔥 Расширяемость: расширяйте библиотеку с помощью кастомных границ слов и регистров текста.
  • 🔥 Точность: находит любые границы слов в строках, включая аббревиатуры и сокращения (как в "HTTPRequest").
  • 🔥 Поддержка не-ASCII: обрабатывает не-ASCII символы без проблем (не делается никаких выводов о самом языке ввода).
  • 🔥 Лёгкость, производительность, нет зависимостей: эффективная библиотека без регулярных выражений, которая остаётся легкой и не имеет внешних зависимостей.
  • 🔥 100% покрытие тестами: каждая строка кода тщательно протестирована на надёжность.
  • 🔥 100% типизированная кодовая база: полные аннотации типов для лучшего опыта разработки.

Установка#

pip install textcaseГотово!

Использование#

Конвертируйте строки в текстовые регистры:

cases.py
import textcase

textcase.snake("Hello, world!")  # hello_world
textcase.constant("Hello, world!")  # HELLO_WORLD
textcase.kebab("Hello, world!")  # hello-world
textcase.middot("Hello, world!")  # hello·world
textcase.camel("Hello, world!")  # helloWorld
textcase.pascal("Hello, world!")  # HelloWorld
textcase.lower("Hello, world!")  # hello world
textcase.upper("Hello, world!")  # HELLO WORLD
textcase.title("Hello, world!")  # Hello World
textcase.sentence("Hello, world!")  # Hello world

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

match.py
1
2
3
4
5
import textcase

textcase.kebab.match("css-class-name")  # True
textcase.snake.match("css-class-name")  # False
textcase.snake.match("CSS_CLASS_NAME")  # False

Границы#

По умолчанию библиотека разделяет слова по заданным по умолчанию границам слов, а именно:

  • Подчёркивания: "_",
  • Дефисы: "-",
  • Пробелы: " ",
  • Интерпункты: "·",
  • Изменение регистра с нижнего на верхний: "aA",
  • Соседние цифры и буквы: "a1", "1a", "A1", "1A",
  • Аббревиатуры и сокращения: "AAa" (как в "HTTPRequest").

Вы можете узнать больше о границах тут.

Точность#

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

precision.py
1
2
3
4
import textcase

textcase.title("27-07_my_cat")  # 27 07 My Cat
textcase.title("27-07_my_cat", boundaries=[textcase.UNDERSCORE], strip_punctuation=False)  # 27-07 My Cat

Эта библиотека может обнаруживать аббревиатуры и сокращения в строках типа camel. Она также игнорирует любые начальные, конечные или дублирующие разделители:

acronyms.py
1
2
3
4
5
import textcase

textcase.snake("IOStream")  # io_stream
textcase.snake("myJSONParser")  # my_json_parser
textcase.snake("__weird--var _name-")  # weird_var_name

Не-ASCII Символы#

Библиотека также поддерживает символы, не входящие в ASCII. Однако никаких выводов о самом языке ввода не делается. Например, в голландском языке диграф "ij" обрабатывается как два отдельных символа Unicode и не будет написан заглавными буквами. Напротив, символ "æ" будет написан заглавными буквами, как и ожидалось. Кроме того, в английском языке текст "I THINK I DO" будет преобразован в "i think i do", а не "I think I do". Это означает, что библиотека может обрабатывать различные символы:

non_ascii.py
1
2
3
4
5
import textcase

textcase.kebab("GranatÄpfel")  # granat-äpfel
textcase.title("ПЕРСПЕКТИВА24")  # Перспектива 24
textcase.lower("ὈΔΥΣΣΕΎΣ")  # ὀδυσσεύς

Пунктуация#

По умолчанию символы, за которыми следуют цифры и наоборот, считаются границами слов. Кроме того, символы пунктуация удаляются (исключая текущий регистр delimiter), а другие специальные символы игнорируются. Вы можете управлять этим поведением с помощью аргумента strip_punctuation:

punctuation.py
1
2
3
4
5
6
7
8
import textcase

textcase.snake("E5150")  # e_5150
textcase.title("ONE\nTWO")  # One\ntwo
textcase.snake("10,000Days")  # 10000_days

textcase.upper("Hello, world!")  # HELLO WORLD
textcase.upper("Hello, world!", strip_punctuation=False)  # HELLO, WORLD!