将一个字符串拆分成一个列表,留下重音字符和表情符号,但删除标点符号

Sof*_*fia 2 python string split emoticons

如果我有字符串:

"O João foi almoçar :) ." 
Run Code Online (Sandbox Code Playgroud)

我如何最好将它分成python中的单词列表,如下所示:

['O','João', 'foi', 'almoçar', ':)']
Run Code Online (Sandbox Code Playgroud)

谢谢 :)

苏菲亚

mar*_*cog 7

如果标点符号与您的示例一样落入其自己的空格分隔标记中,那么很容易:

>>> filter(lambda s: s not in string.punctuation, "O João foi almoçar :) .".split())
['O', 'Jo\xc3\xa3o', 'foi', 'almo\xc3\xa7ar', ':)']
Run Code Online (Sandbox Code Playgroud)

如果不是这种情况,你可以像这样定义一个表情词典(你需要添加更多):

d = { ':)': '<HAPPY_SMILEY>', ':(': '<SAD_SMILEY>'}
Run Code Online (Sandbox Code Playgroud)

然后用不包含标点符号的占位符替换笑脸的每个实例(我们认为<>不是标点符号):

for smiley, placeholder in d.iteritems():
    s = s.replace(smiley, placeholder)
Run Code Online (Sandbox Code Playgroud)

这让我们到了"O João foi almoçar <HAPPY_SMILEY> .".

然后我们删除标点符号:

s = ''.join(filter(lambda c: c not in '.,!', list(s)))
Run Code Online (Sandbox Code Playgroud)

这给了我们"O João foi almoçar <HAPPY_SMILEY>".

我们确实还原了笑脸:

for smiley, placeholder in d.iteritems():
    s = s.replace(placeholder, smiley)
Run Code Online (Sandbox Code Playgroud)

我们然后拆分:

s = s.split()
Run Code Online (Sandbox Code Playgroud)

给我们最后的结果:['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()
Run Code Online (Sandbox Code Playgroud)