Разбейте строку на список, оставив акцентированные символы и смайлики, но убрав пунктуацию - PullRequest
2 голосов
/ 26 декабря 2010

Если у меня есть строка:

"O João foi almoçar :) ." 

как мне лучше разбить его на список слов в python, например:

['O','João', 'foi', 'almoçar', ':)']

Спасибо:)

София

Ответы [ 2 ]

7 голосов
/ 26 декабря 2010

Если пунктуация попадает в собственный токен, разделенный пробелами, как в вашем примере, то это просто:

>>> 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()
0 голосов
/ 15 июня 2015
>>> import string
>>> [ i for i in s.split(' ') if i not in string.punctuation]
['O', 'João', 'foi', 'almoçar', ':)']
...