使用空格作为分隔符和最大长度来拆分字符串

9

我想以类似于 .split() 的方式分割字符串(因此结果为列表),但更加智能:我希望将其分成最多15个字符的块,但不要在单词中间分割,例如:

string = 'A string with words'

[splitting process takes place]

list = ('A string with','words')

在这个例子中,字符串被分成了'with'和'words'两部分,因为这是你可以进行分割的最后一个位置,并且第一部分少于15个字符。

2
对于长度超过15个字符的单词该怎么处理? - SilentGhost
该字符串经过大量编辑,以确保编辑器从未使用超过15个字符的单词。 - chrism
3个回答

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

而且最好的部分是,该软件包通常已经存在。 - Mariana B.

6
您可以通过两种不同的方式来完成这个任务:
>>> 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']

请注意空格处理的细微差别。

两种都是不错的选择,但请注意,它们都不能很好地处理超过15个字符的单词。
s = 'A string with supercalifragilistic words' textwrap.wrap(s,15) ['A string with s', 'upercalifragili', 'stic words'] re.findall(r'\b.{1,15}\b', s) ['A string with ', ' words']
- Dave Costa
1
定义"非常好"。如果您正在换行文本,而某个单词比终端的宽度更长,那么您非常希望将该单词分成符合终端宽度的块,因为该宽度是硬限制。 - jemfinch

1

你可能想要使用正则表达式。Python re 模块有一个 split 函数,但我认为你最好通过匹配组来实现。

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

[编辑] 抱歉,我错过了您想要多个块的要点。我本来想在这里放置一个更复杂的正则表达式,但上面提到的textwrap模块就是为此而设计的。如果您选择,我将把扩展正则表达式作为一项练习留给您。


我喜欢这个,因为在我的非常有限的测试中它不会分割或丢失超过15个字符的单词。 - Dave Costa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接