Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Truncate a string without ending in the middle of a word

I am looking for a way to truncate a string in Python that will not cut off the string in the middle of a word.

For example:

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

I'm looking for a way to accomplish the "smart" truncate from above.

like image 812
Jack Avatar asked Oct 30 '08 14:10

Jack


People also ask

How do you truncate a string?

Truncate the string (first argument) if it is longer than the given maximum string length (second argument) and return the truncated string with a ... ending. The inserted three dots at the end should also add to the string length.

How do I truncate a string in Python?

The other way to truncate a string is to use a rsplit() python function. rsplit() function takes the string, a delimiter value to split the string into parts, and it returns a list of words contained in the string split by the provided delimiter.

What does it mean to truncate a string?

Truncation in IT refers to “cutting” something, or removing parts of it to make it shorter. In general, truncation takes a certain object such as a number or text string and reduces it in some way, which makes it less resources to store.

How do you shorten a field in SQL?

SQL Server TRIM() Function The TRIM() function removes the space character OR other specified characters from the start or end of a string. By default, the TRIM() function removes leading and trailing spaces from a string. Note: Also look at the LTRIM() and RTRIM() functions.


2 Answers

I actually wrote a solution for this on a recent project of mine. I've compressed the majority of it down to be a little smaller.

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

What happens is the if-statement checks if your content is already less than the cutoff point. If it's not, it truncates to the desired length, splits on the space, removes the last element (so that you don't cut off a word), and then joins it back together (while tacking on the '...').

like image 95
Adam Avatar answered Sep 26 '22 06:09

Adam


Here's a slightly better version of the last line in Adam's solution:

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

(This is slightly more efficient, and returns a more sensible result in the case there are no spaces in the front of the string.)

like image 23
bobince Avatar answered Sep 26 '22 06:09

bobince