Выделение только буквенных символов в языке программирования Python

Раздел: Работа со строками -> Фильтрация строк

Основной метод: filter и isalpha

Чтобы оставить в строке только буквенные символы, проще всего использовать комбинацию функции filter и метода str.isalpha. Это решение работает с любыми алфавитами (кириллица, латиница) и выполняется на C-уровне.


s = 'Hello123, Мир! 2023'
result = ''.join(filter(str.isalpha, s))
print(result)  # HelloМир
    

найти буквы python (извлечение букв из строки в python)

Цели: быстрое и лаконичное извлечение букв, когда не требуется тонкая настройка (например, сохранение пробелов).

Возможные проблемы:

  • isalpha пропускает буквы всех языков, включая китайские иероглифы. Чтобы ограничиться латиницей и кириллицей, нужна дополнительная проверка.
  • Пробелы и знаки препинания удаляются, что может быть нежелательно.
  • Для очень длинных строк ''.join создаёт новую строку, потребляющую память.

Как извлечь буквы с помощью регулярного выражения?

Регулярные выражения позволяют точно указать, какие символы оставить. Например, только латиницу и кириллицу.


import re
s = 'Hello123, Мир!'
result = re.sub(r'[^a-zA-Zа-яА-ЯёЁ]', '', s)
print(result)  # HelloМир
    

Цели: гибкое задание алфавита, возможность сохранить пробелы или дефисы, если включить их в класс.

Проблемы:

  • Для Unicode с диакритическими знаками нужно использовать модуль regex или категории unicodedata.
  • Регулярные выражения медленнее filter при однократном вызове.
  • Сложность поддержки при смене набора символов.

Как удалить не-буквы с помощью str.translate?

Метод str.translate использует заранее подготовленную таблицу удаления. Эффективен для многократной фильтрации разных строк.


import string
all_ascii = ''.join(chr(i) for i in range(128))
not_letters = ''.join(c if not c.isalpha() else '' for c in all_ascii)
trans_table = str.maketrans('', '', not_letters)
s = 'Hello123, World!'
result = s.translate(trans_table)
print(result)  # HelloWorld
    

Цели: обработка больших массивов строк с постоянным набором символов для удаления.

Проблемы:

  • Таблица для полного Unicode содержит более миллиона символов, что требует памяти и времени.
  • Проще обойтись filter или re.sub.

Как извлечь только латинские буквы (a-z, A-Z)?

Если кириллица не нужна, можно ограничиться сравнением с диапазонами ASCII или использовать string.ascii_letters.


import string
s = 'Hello123, Мир!'
result = ''.join(c for c in s if c in string.ascii_letters)
print(result)  # Hello
    

Цели: работа с англоязычными текстами, где кириллица считается шумом.

Проблемы:

  • Не учитываются буквы с диакритическими знаками (é, ü).
  • Для кириллицы потребуется отдельный диапазон.

Как извлечь только кириллические буквы?

Можно проверить принадлежность к диапазонам Unicode кириллицы, включая букву ё.


s = 'Hello123, Привет!'
result = ''.join(c for c in s if ('а' <= c <= 'я' or 'А' <= c <= 'Я' or c == 'ё' or c == 'Ё'))
print(result)  # Привет
    

Цели: извлечение только русского текста из смешанной строки.

Проблемы:

  • Другие кириллические символы (украинские, белорусские) не пропустятся.
  • Для полного покрытия лучше использовать unicodedata с категорией 'L' и проверкой алфавита.

Как извлечь буквы с помощью спискового включения (list comprehension)?

Классическая альтернатива filter - генератор списка с последующим объединением.


s = 'Hello123, Мир!'
result = ''.join([c for c in s if c.isalpha()])
print(result)  # HelloМир
    

Цели: привычный синтаксис для Python-программистов, легко читается.

Проблемы:

  • Создаётся промежуточный список, что может быть неэффективно для огромных строк, хотя разница незначительна.
  • Те же ограничения по isalpha, что и для filter.

Как извлечь буквы с учётом диакритических знаков (é, ü)?

Метод unicodedata.category возвращает категорию символа. Буквы имеют категории, начинающиеся с 'L'. Это покрывает все Unicode-буквы.


import unicodedata
s = 'Café résumé'
result = ''.join(c for c in s if unicodedata.category(c).startswith('L'))
print(result)  # Caférésumé
    

Цели: максимально полное извлечение букв из текста на любых языках.

Проблемы:

  • Вызов unicodedata.category для каждого символа может быть медленнее isalpha, но точнее.
  • Не различает алфавиты (кириллица, латиница) - возвращает все буквы мира.

Расширенные примеры извлечения букв

Пример 1. Удаление всех небуквенных символов, но сохранение пробелов.

Пример

import re
text = 'Hello, World! 123'
# re.sub с включением \s в класс разрешённых символов
result = re.sub(r'[^a-zA-Z\s]', '', text)
print(repr(result))  # 'Hello World '
'Hello World '

Пример 2. Извлечение букв из списка строк с помощью filter.

Пример

strings = ['Hello123', 'Мир!', 'Python 3.9']
result = [''.join(filter(str.isalpha, s)) for s in strings]
print(result)  # ['Hello', 'Мир', 'Python']
['Hello', 'Мир', 'Python']

Пример 3. Разница между isalpha() и isalnum(). Первая оставляет только буквы, вторая - буквы и цифры.

Пример

s = 'abc123'
letters = ''.join(c for c in s if c.isalpha())
alnum = ''.join(c for c in s if c.isalnum())
print(letters)  # abc
print(alnum)    # abc123
abc
abc123

Пример 4. Обработка строки с Emoji. isalpha возвращает False для эмодзи, поэтому они удаляются.

Пример

s = 'Hello ? World ?'
result = ''.join(filter(str.isalpha, s))
print(repr(result))  # 'HelloWorld'
'HelloWorld'

Пример 5. Использование unicodedata для извлечения букв со знаками ударения.

Пример

import unicodedata
text = 'Déjà vu'
result = ''.join(c for c in text if unicodedata.category(c).startswith('L'))
print(result)  # Déjàvu
Déjàvu

Пример 6. Фильтрация строки с помощью map и filter для нескольких строк.

Пример

strings = ['A1!', 'B2@', 'C3#']
result = list(map(lambda s: ''.join(filter(str.isalpha, s)), strings))
print(result)  # ['A', 'B', 'C']
['A', 'B', 'C']

Пример 7. Извлечение букв и цифр с помощью isalnum, а затем удаление цифр.

Пример

s = 'Room 101'
# Сначала оставляем буквы и цифры, потом удаляем цифры
step1 = ''.join(c for c in s if c.isalnum())
step2 = ''.join(c for c in step1 if not c.isdigit())
print(step2)  # Room
Room

извлечение букв из строки в Python - comments

En
найти буквы python (python)