您已经有了答案,但只是想补充一点,并非所有标点符号都应该放在左侧。如果您想处理更一般的句子,您可以使用例如括号或撇号,并且您不想以以下结尾:
这是一部很棒的电影(我看过的最好的)
我想说创建一些讨厌的单线是没有意义的,只是以大多数 Python 的方式来做到这一点。如果不需要超快的解决方案,可以考虑一步步解决,例如:
import re
s = ['It', "'", 's', 'a', 'great', 'movie',
'(', 'best', 'I', "'", 've', 'seen', ')']
s = " ".join(s) # join normally
s = re.sub(" ([,.;\)])", lambda m: m.group(1), s) # stick to left
s = re.sub("([\(]) ", lambda m: m.group(1), s) # stick to right
s = re.sub(" ([']) ", lambda m: m.group(1), s) # join both sides
print s # It's a great movie (best I've seen)
它非常灵活,您可以指定每条规则处理的标点符号...虽然它有 4 行,所以您可能不喜欢它。无论你选择哪种方法,都可能有一些句子不能正常工作并需要特殊情况,所以无论如何单行可能只是一个糟糕的选择。
编辑:实际上,您可以将上述解决方案简化为一行,但如前所述,我很确定还有更多情况需要考虑:
print re.sub("( [,.;\)]|[\(] | ['] )", lambda m: m.group(1).strip(), " ".join(s))