按长度将字符串分成字符串?

有没有一种方法可以在不知道字符串长度的情况下,将一个长度为 4*x字符的字符串切割成4个字符串,每个字符长度为 x字符?

例如:

>>>x = "qwertyui"
>>>split(x, one, two, three, four)
>>>two
'er'
183010 次浏览
>>> x = "qwertyui"
>>> chunks, chunk_size = len(x), len(x)//4
>>> [ x[i:i+chunk_size] for i in range(0, chunks, chunk_size) ]
['qw', 'er', 'ty', 'ui']

我试了亚历山大的答案,但在 Python 3中得到了这个错误:

TypeError: ‘ float’对象不能解释为整数

这是因为 Python 3中的除法运算符返回了一个 float:

>>> x = "qwertyui"
>>> chunks, chunk_size = len(x), len(x)//4
>>> [ x[i:i+chunk_size] for i in range(0, chunks, chunk_size) ]
['qw', 'er', 'ty', 'ui']

注意第2行末尾的 //,以确保截断为整数。

下面是一行程序,它不需要事先知道字符串的长度:

from functools import partial
from StringIO import StringIO


[l for l in iter(partial(StringIO(data).read, 4), '')]

如果您有一个文件或套接字,那么就不需要 StringIO 包装器:

[l for l in iter(partial(file_like_object.read, 4), '')]

对于那些更喜欢可读性的人来说:

def itersplit_into_x_chunks(string,x=10): # we assume here that x is an int and > 0
size = len(string)
chunksize = size//x
for pos in range(0, size, chunksize):
yield string[pos:pos+chunksize]

产出:

>>> list(itersplit_into_x_chunks('qwertyui',x=4))
['qw', 'er', 'ty', 'ui']

我的解决办法

   st =' abs de fdgh  1234 556 shg shshh'
print st


def splitStringMax( si, limit):
ls = si.split()
lo=[]
st=''
ln=len(ls)
if ln==1:
return [si]
i=0
for l in ls:
st+=l
i+=1
if i <ln:
lk=len(ls[i])
if (len(st))+1+lk < limit:
st+=' '
continue
lo.append(st);st=''
return lo


############################


print  splitStringMax(st,7)
# ['abs de', 'fdgh', '1234', '556', 'shg', 'shshh']
print  splitStringMax(st,12)


# ['abs de fdgh', '1234 556', 'shg shshh']
def split2len(s, n):
def _f(s, n):
while s:
yield s[:n]
s = s[n:]
return list(_f(s, n))

这里有两种通用的方法。也许值得添加到您自己的可重用性库中。第一个要求项是可切片的,第二个要求使用任何迭代器(但是要求它们的构造函数接受迭代器)。

def split_bylen(item, maxlen):
'''
Requires item to be sliceable (with __getitem__ defined)
'''
return [item[ind:ind+maxlen] for ind in range(0, len(item), maxlen)]
#You could also replace outer [ ] brackets with ( ) to use as generator.


def split_bylen_any(item, maxlen, constructor=None):
'''
Works with any iterables.
Requires item's constructor to accept iterable or alternatively
constructor argument could be provided (otherwise use item's class)
'''
if constructor is None: constructor = item.__class__
return [constructor(part) for part in zip(* ([iter(item)] * maxlen))]
#OR: return map(constructor, zip(* ([iter(item)] * maxlen)))
#    which would be faster if you need an iterable, not list

因此,在 topicstarter 的例子中,用法是:

string = 'Baboons love bananas'
parts = 5
splitlen = -(-len(string) // parts) # is alternative to math.ceil(len/parts)


first_method = split_bylen(string, splitlen)
#Result :['Babo', 'ons ', 'love', ' ban', 'anas']


second_method = split_bylen_any(string, splitlen, constructor=''.join)
#Result :['Babo', 'ons ', 'love', ' ban', 'anas']

在许多情况下,需要进行字符串分割,比如需要对给定字符串的字符进行排序,用另一个字符替换一个字符等等。但是所有这些操作都可以通过下面提到的字符串分割方法来执行。

字符串分割可以通过两种方式进行:

  1. 根据拆分的长度对给定字符串进行切片。

  2. 使用 list (str)函数将给定的字符串转换为列表,其中字符串分解的字符构成列表的元素。然后执行所需的操作,并在原始字符串的字符之间加入“指定字符”。Join (list)以获取新的处理过的字符串。

l = 'abcdefghijklmn'


def group(l,n):
tmp = len(l)%n
zipped = zip(*[iter(l)]*n)
return zipped if tmp == 0 else zipped+[tuple(l[-tmp:])]


print group(l,3)

我有个 re的窍门:

In [28]: import re


In [29]: x = "qwertyui"


In [30]: [x for x in re.split(r'(\w{2})', x) if x]
Out[30]: ['qw', 'er', 'ty', 'ui']

然后是一个乐队,它可能看起来像:

def split(string, split_len):
# Regex: `r'.{1}'` for example works for all characters
regex = r'(.{%s})' % split_len
return [x for x in re.split(regex, string) if x]
  • : param s: str; 源字符串
  • : param w: int; 可拆分的宽度

使用文本包装模块:

PyDocs-文本包装

import textwrap
def wrap(s, w):
return textwrap.fill(s, w)

校对: return str:

灵感来自 亚历山大的回答

PyDocs-数据结构

def wrap(s, w):
return [s[i:i + w] for i in range(0, len(s), w)]
  • 返还清单:

受埃里克答案的启发

PyDocs-regex

import re
def wrap(s, w):
sre = re.compile(rf'(.\{\{{w}}})')
return [x for x in re.split(sre, s) if x]
  • 返还清单:
length = 4
string = "abcdefgh"
str_dict = [ o for o in string ]
parts = [ ''.join( str_dict[ (j * length) : ( ( j + 1 ) * length ) ]   ) for j in xrange(len(string)/length  )]
some_string="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
x=3
res=[some_string[y-x:y] for y in range(x, len(some_string)+x,x)]
print(res)

会产生

['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR', 'STU', 'VWX', 'YZ']
# spliting a string by the length of the string


def len_split(string,sub_string):
n,sub,str1=list(string),len(sub_string),')/^0*/-'
for i in range(sub,len(n)+((len(n)-1)//sub),sub+1):
n.insert(i,str1)
n="".join(n)
n=n.split(str1)
return n


x="divyansh_looking_for_intership_actively_contact_Me_here"
sub="four"
print(len_split(x,sub))


# Result-> ['divy', 'ansh', 'tiwa', 'ri_l', 'ooki', 'ng_f', 'or_i', 'nter', 'ship', '_con', 'tact', '_Me_', 'here']

每隔 n 个字符分割字符串?中,“狼”给出了最简洁的答案:

>>> import re
>>> re.findall('..','1234567890')
['12', '34', '56', '78', '90']