截断字符串但不在单词中间结束
我想找一种方法,在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语句会检查你的内容是否已经短于设定的长度。如果没有达到这个长度,它就会把内容截断到你想要的长度,然后根据空格进行分割,去掉最后一个元素(这样就不会把一个单词截断),最后再把它们拼接在一起(并加上'...')。