<p>如果标点符号落在自己的空格分隔标记中,就像您的示例一样,那么很容易:</p>
<pre><code>>>> filter(lambda s: s not in string.punctuation, "O João foi almoçar :) .".split())
['O', 'Jo\xc3\xa3o', 'foi', 'almo\xc3\xa7ar', ':)']
</code></pre>
<p>如果不是这样,您可以像这样定义一个笑脸词典(您需要添加更多):</p>
^{pr2}$
<p>然后用不包含标点符号的占位符替换smiley的每个实例(我们将认为<code><></code>不是标点):</p>
<pre><code>for smiley, placeholder in d.iteritems():
s = s.replace(smiley, placeholder)
</code></pre>
<p>这样我们就可以<code>"O João foi almoçar <HAPPY_SMILEY> ."</code>。在</p>
<p>然后去掉标点:</p>
<pre><code>s = ''.join(filter(lambda c: c not in '.,!', list(s)))
</code></pre>
<p>这给了我们<code>"O João foi almoçar <HAPPY_SMILEY>"</code>。在</p>
<p>我们会还原笑脸:</p>
<pre><code>for smiley, placeholder in d.iteritems():
s = s.replace(placeholder, smiley)
</code></pre>
<p>然后我们分开:</p>
<pre><code>s = s.split()
</code></pre>
<p>给我们最后的结果:<code>['O', 'Jo\xc3\xa3o', 'foi', 'almo\xc3\xa7ar', ':)']</code>。在</p>
<p>把它们组合成一个函数:</p>
<pre><code>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()
</code></pre>