Прежде всего, я не думаю, что вы намерены использовать пунктуацию в качестве разделителей в функциях разделения. Ваше описание предполагает, что вы просто хотите исключить пунктуацию из результирующих строк.
Я сталкиваюсь с этим довольно часто, и мое обычное решение не требует повторения.
однострочная лямбда-функция с пониманием списка:
(требуется import string
):
split_without_punc = lambda text : [word.strip(string.punctuation) for word in
text.split() if word.strip(string.punctuation) != '']
# Call function
split_without_punc("Hey, you -- what are you doing?!")
# returns ['Hey', 'you', 'what', 'are', 'you', 'doing']
Функция (традиционная)
Как традиционная функция, это всего лишь две строки с пониманием списка (в дополнение к import string
):
def split_without_punctuation2(text):
# Split by whitespace
words = text.split()
# Strip punctuation from each word
return [word.strip(ignore) for word in words if word.strip(ignore) != '']
split_without_punctuation2("Hey, you -- what are you doing?!")
# returns ['Hey', 'you', 'what', 'are', 'you', 'doing']
Это также естественным образом оставит сокращения и дефисные слова без изменений. Вы всегда можете использовать text.replace("-", " ")
, чтобы превратить дефисы в пробелы перед разбиением.
Общая функция без лямбды или понимания списка
Для более общего решения (где вы можете указать символы для исключения) и без понимания списка, вы получите:
def split_without(text: str, ignore: str) -> list:
# Split by whitespace
split_string = text.split()
# Strip any characters in the ignore string, and ignore empty strings
words = []
for word in split_string:
word = word.strip(ignore)
if word != '':
words.append(word)
return words
# Situation-specific call to general function
import string
final_text = split_without("Hey, you - what are you doing?!", string.punctuation)
# returns ['Hey', 'you', 'what', 'are', 'you', 'doing']
Конечно, вы всегда можете обобщить лямбда-функцию на любую указанную строку символов.