截断字符串但不在单词中间结束

45 投票
10 回答
32683 浏览
提问于 2025-04-11 18:12

我想找一种方法,在Python中截断字符串时,不会把单词截断到中间。

比如说:

Original:          "This is really awesome."
"Dumb" truncate:   "This is real..."
"Smart" truncate:  "This is really..."

我想实现上面提到的那种“智能”截断。

10 个回答

11

这里有一些细节,可能对你有帮助,也可能不是,比如如何处理制表符(比如你可能把它显示成8个空格,但内部其实只当作1个字符来处理),还有各种不同类型的空白符的处理,或者是否允许在连字符处换行等等。如果你对这些功能感兴趣,可以看看textwrap模块。比如:

def truncate(text, max_size):
    if len(text) <= max_size:
        return text
    return textwrap.wrap(text, max_size-3)[0] + "..."

默认情况下,如果单词超过最大长度(max_size),系统会把它拆开(这就意味着max_size是一个硬性限制)。你可以通过在wrap()函数中传入break_long_words=False来改变这个行为,这样它就会返回整个单词。如果你想要这个行为,可以把最后一行改成:

    lines = textwrap.wrap(text, max_size-3, break_long_words=False)
    return lines[0] + ("..." if len(lines)>1 else "")

还有一些其他选项,比如expand_tabs,可能会根据你想要的具体行为而对你有帮助。

48

这是亚当解决方案最后一行的一个稍微改进的版本:

return content[:length].rsplit(' ', 1)[0]+suffix

(这个版本效率稍微高一点,而且如果字符串前面没有空格时,返回的结果更合理。)

69

其实我在最近的一个项目中写了一个解决方案。我把大部分内容压缩了一下,让它变得更简洁。

def smart_truncate(content, length=100, suffix='...'):
    if len(content) <= length:
        return content
    else:
        return ' '.join(content[:length+1].split(' ')[0:-1]) + suffix

这个过程是这样的:if语句会检查你的内容是否已经短于设定的长度。如果没有达到这个长度,它就会把内容截断到你想要的长度,然后根据空格进行分割,去掉最后一个元素(这样就不会把一个单词截断),最后再把它们拼接在一起(并加上'...')。

撰写回答