Если пунктуация попадает в собственный токен, разделенный пробелами, как в вашем примере, то это просто:
>>> filter(lambda s: s not in string.punctuation, "O João foi almoçar :) .".split())
['O', 'Jo\xc3\xa3o', 'foi', 'almo\xc3\xa7ar', ':)']
Если это не так, вы можете определить словарь смайликов следующим образом (вам нужно добавить больше):
d = { ':)': '<HAPPY_SMILEY>', ':(': '<SAD_SMILEY>'}
и затем замените каждый экземпляр смайлика заполнителем, который не содержит знаков препинания (мы будем считать <>
пунктуацией):
for smiley, placeholder in d.iteritems():
s = s.replace(smiley, placeholder)
Что приводит нас к "O João foi almoçar <HAPPY_SMILEY> ."
.
Затем лишаем пунктуации:
s = ''.join(filter(lambda c: c not in '.,!', list(s)))
Что дает нам "O João foi almoçar <HAPPY_SMILEY>"
.
Мы возвращаем смайлики:
for smiley, placeholder in d.iteritems():
s = s.replace(placeholder, smiley)
Который мы затем разделим:
s = s.split()
Даем нам наш окончательный результат: ['O', 'Jo\xc3\xa3o', 'foi', 'almo\xc3\xa7ar', ':)']
.
Собираем все вместе в функцию:
def split_special(s):
d = { ':)': '<HAPPY_SMILEY>', ':(': '<SAD_SMILEY>'}
for smiley, placeholder in d.iteritems():
s = s.replace(smiley, placeholder)
s = ''.join(filter(lambda c: c not in '.,!', list(s)))
for smiley, placeholder in d.iteritems():
s = s.replace(placeholder, smiley)
return s.split()