Python - убрать все символы из слов, кроме букв - оптимизация

Разделил длинный текст на отдельные слова, вот пример нескольких слов:

  • Привет!!!
  • -где-то
  • ;приехать
  • =>>Hello
  • пол-лимона;
  • попросил))))
  • !!!
  • Ёжик1
  • а

Требуется теперь очистить все символы в словах кроме букв и кроме дефисов внутри слов. Применил такую логику - ищем первую букву в начале слова и последнюю в конце, это и является началом и концом очищенного слова. Мне кажется немного топорное решение, может есть более интересные или упрощенные варианты? Через регулярное выражение, как понимаю, не получится, так как тогда внутри слова уберутся дефисы. Написал следующий код.


Ответы (2 шт):

Автор решения: dzhukov
list=['Привет!!!',
      '-где-то',
      ';приехать',
      '=>>Hello',
      'пол-лимона;',
      'попросил))))',
      '!!!',
      '  ',
      'Ёжик1',
      'а'
      ]

def Get_Clean_Word (word):
    #word=WordDirty
    for i in range(len(word)):
        letter=word[i].encode('windows-1251')
        start=-1
        if 192<=ord(letter)<=255 or ord(letter)==168 or ord(letter)==184 or 65<=ord(letter)<=90 or 97<=ord(letter)<=122:
            start=i
            break
    for i in range(len(word)):
        letter = word[len(word)-i-1].encode('windows-1251')
        if 192<=ord(letter)<=255 or ord(letter)==168 or ord(letter)==184 or 65<=ord(letter)<=90 or 97<=ord(letter)<=122:
            end=len(word)-i
            break
    if start==-1:
        clean_word=''
    else:
        clean_word=word[start:end]
    return (clean_word)

list_clean=[]
for WordDirty in list:
    list_clean.append(Get_Clean_Word(WordDirty))

print(list_clean)

→ Ссылка
Автор решения: gil9red

Использовал регулярку, чтобы удалить все символы, что не подходят нам: не буквы и не дефисы. После удалил слева и справа дефисы.

Пример:

import re

words = [
    'Привет!!!',
    '-где-то',
    ';приехать',
    '=>>Hello',
    'пол-лимона;',
    'попросил))))',
    '!!!',
    '  ',
    'Ёжик1',
    'а',
    "П_Р_И_В_Е_Т"
]

def get_clean_word(word: str) -> str:
    word = re.sub('[^a-zа-яё-]', '', word, flags=re.IGNORECASE)
    word = word.strip('-')
    return word

list_clean = [get_clean_word(word) for word in words]
print(list_clean)
# ['Привет', 'где-то', 'приехать', 'Hello', 'пол-лимона', 'попросил', '', '', 'Ёжик', 'а', 'ПРИВЕТ']
→ Ссылка