Tronquer une chaîne sans fin, au milieu d'un mot
Je suis à la recherche d'un moyen de tronquer une chaîne de caractères en Python qui n'aura pas couper la corde en son milieu d'un mot.
Par exemple:
Original: "C'est vraiment génial." "Muets" truncate: "C'est vrai..." "Smart" truncate: "C'est vraiment..."
Je suis à la recherche d'un moyen d'atteindre le "smart" tronquer à partir de ci-dessus.
Vous devez vous connecter pour publier un commentaire.
J'ai en fait écrit une solution pour cela sur un récent projet de la mine. J'ai compressé la majorité de celui-ci vers le bas pour être un peu plus petit.
Ce qui se passe est le if vérifie si le contenu est déjà moins que le point de coupure. Si elle ne l'est pas, il tronque à la longueur désirée, divise l'espace, supprime le dernier élément (de sorte que vous ne pas couper un mot), et rejoint ensuite remis ensemble (tout en clouant sur la '...').
return ' '.join(content[:length+1-len(suffix)].split(' ')[0:-1]) + suffix
content[:length+1]
arrive à la fin dans un espace, la chaîne retournée sera plus long quelength
. Il en va de même pourcontent[:length+1-len(suffix)
de @Stan commentaire.Voici un peu plus de version de la dernière ligne Adam solution:
(Ce qui est légèrement plus efficace, et renvoie un plus raisonnable résultat dans le cas où il n'existe aucun espace à l'avant de la chaîne.)
return content if len(content) <= length else content[:length-len(suffix)].rsplit(' ', 1)[0] + suffix
Il y a quelques subtilités qui peuvent ou peuvent ne pas être les problèmes pour vous, comme la gestion des onglets (par exemple. si vous êtes en les présentant comme des 8 espaces, mais de les traiter comme 1 caractère interne), le traitement des différentes saveurs de la rupture et de non-rupture des espaces, ou de permettre à la rupture sur la coupure de mots, etc. Si tout cela est souhaitable, vous voudrez peut-être prendre un coup d'oeil au module d'habillage de texte. par exemple:
Le comportement par défaut pour les mots de plus de max_size est pour les casser (prise de max_size une dure limite). Vous pouvez modifier la limite douce utilisée par les autres solutions ici en passant break_long_words=False pour wrap(), auquel cas il sera de retour le mot en entier. Si vous voulez que ce changement de comportement de la dernière ligne:
Il ya quelques autres options comme expand_tabs qui peuvent être d'intérêt selon la nature exacte de comportement que vous voulez.
OU
OU
Vous suffit de prendre le premier élément de cette et vous avez terminé...
textwrap.shorten("Hello world", width=10, placeholder="...")
serait de produire des"Hello..."
docs.python.org/3.5/library/textwrap.htmlDe le tester:
De Python 3.4+ vous pouvez utiliser d'habillage de texte.raccourcir. Avec l'OP exemple: