Вы можете использовать re.split
re.split('[\s|!\?\.;:"]', text)
Однако, если текст очень большой, результирующий массив может занимать слишком много памяти. Тогда вы можете рассмотреть re.finditer:
import re
def getwords(text, splitchars=' \t|!?.;:"'):
words_iter = re.finditer(
"([%s]+)" % "".join([("^" + c) for c in splitchars]),
text)
for word in words_iter:
yield word.group()
# a quick test
s = "a:b cc? def...a||"
words = [x for x in getwords(s)]
assert ["a", "b", "cc", "def", "a"] == words, words