9
votes

Diviser une chaîne en utilisant des délimiteurs d'espace et une longueur maximale

Je voudrais diviser une chaîne de la même manière que .split () (ainsi résultant dans une liste) mais de manière plus intelligente: j'aimerais qu'il le divise en des morceaux de jusqu'à 15 caractères, mais ne sont pas divisés à mi-mot, donc: xxx

La chaîne de cet exemple est divisée entre "avec" et "mots" parce que c'est le dernier endroit où vous pouvez diviser et le premier bit comporte 15 caractères ou moins.


2 commentaires

Que faire avec les mots plus longs que 15 caractères?


La chaîne est fortement éduquée, je peux donc vous assurer que l'éditeur n'utilise jamais des mots plus de 15 caractères.


3 Réponses :


1
votes

Vous cherchez probablement à utiliser une regex. Le python RE Module a un divisé code> Fonction, mais je pense que vous seriez mieux servi par des groupes correspondants simplement.

>>> re.findall(r'(.{,15})\s(.*$)', 'A string wth words')
[('A string wth', 'words')]


1 commentaires

J'aime ça parce que cela ne casse pas ou ne perd pas les mots plus de 15 caractères, sur la base de mes tests très limités.



30
votes
>>> import textwrap
>>> string = 'A string with words'
>>> textwrap.wrap(string,15)
['A string with', 'words']

1 commentaires

Et la meilleure partie est que le paquet est généralement déjà dans



6
votes

Vous pouvez faire ces deux manières différentes:

>>> import re, textwrap
>>> s = 'A string with words'
>>> textwrap.wrap(s, 15)
['A string with', 'words']
>>> re.findall(r'\b.{1,15}\b', s)
['A string with ', 'words']


2 commentaires

À la fois bonnes possibilités, mais soyez conscient que ni ne gère les mots plus de 15 caractères très bien >>> S = 'une chaîne avec des mots supercalifragilistiques' >>> textwrap.wrap (S, 15) ["une chaîne avec s" , 'upercalifragili', «mots stiques»] >>> ré.findall (R '\ b. {1,15} \ B', s) ['une chaîne avec', 'mots']


Définir "très bien". Si vous enveloppez du texte et qu'un mot est plus long que la largeur de votre terminal, vous souhaitez très bien diviser ce mot en morceaux de la largeur de votre terminal, car cette largeur est une limite difficile.