将字符串拆分为列表,保留重音字符和表情符号,但删除标点符号

2 投票
2 回答
2217 浏览
提问于 2025-04-16 09:04

如果我有一个字符串:

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

我该如何在Python中将它最好地分割成一个单词列表,像这样:

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

谢谢 :)

索非亚

2 个回答

-1

在编程中,有时候我们需要把一些数据从一个地方转移到另一个地方。这就像把水从一个杯子倒到另一个杯子一样。这个过程可能会涉及到不同的工具和方法,具体取决于我们要处理的数据类型和目标。

例如,如果我们要把一个列表里的数字加起来,我们可以用循环来逐个访问这些数字,就像一个一个地数数一样。这样,我们就能得到总和。

另外,有时候我们还需要把数据存储到文件里,或者从文件里读取数据。这就像把信息写在纸上,或者从纸上查看信息一样。我们可以使用一些简单的命令来完成这些操作。

总之,数据的转移和处理是编程中非常重要的一部分,掌握这些基本操作能帮助我们更好地理解和使用编程语言。

>>> import string
>>> [ i for i in s.split(' ') if i not in string.punctuation]
['O', 'João', 'foi', 'almoçar', ':)']
7

如果标点符号和它自己的空格分开的部分在一起,就像你给的例子那样,那就简单了:

>>> 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()

撰写回答