63

有没有办法在不知道字符串长度的情况下将一个字符长的4*x字符串切成4个字符串,每个字符长?x

例如:

>>>x = "qwertyui"
>>>split(x, one, two, three, four)
>>>two
'er'
4

15 回答 15

105
>>> 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']
于 2012-12-02T19:51:30.943 回答
24

我尝试了 Alexanders 的回答,但在 Python3 中出现了这个错误:

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

这是因为 Python3 中的除法运算符返回一个浮点数。这对我有用:

>>> 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 行末尾的 ,以确保截断为整数。

于 2014-04-30T09:12:48.397 回答
20
  • :param s: str; 源字符串
  • :param w: int; 分割宽度

使用 textwrap 模块:

PyDocs-textwrap

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

:返回字符串:

灵感来自亚历山大的回答

PyDocs-数据结构

def wrap(s, w):
    return [s[i:i + w] for i in range(0, len(s), w)]
  • :返回列表:

受到埃里克回答的启发

PyDocs 正则表达式

import re
def wrap(s, w):    
    sre = re.compile(rf'(.{{{w}}})')
    return [x for x in re.split(sre, s) if x]
  • :返回列表:

完整的代码示例/替代方法

于 2017-10-05T16:55:16.180 回答
9
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']
于 2018-02-09T13:34:22.143 回答
8

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

>>> import re
>>> re.findall('..','1234567890')
['12', '34', '56', '78', '90']
于 2020-10-08T18:32:29.613 回答
7
def split2len(s, n):
    def _f(s, n):
        while s:
            yield s[:n]
            s = s[n:]
    return list(_f(s, n))
于 2016-05-24T20:10:35.553 回答
6

这是一个不需要事先知道字符串长度的单行代码:

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), '')]
于 2014-08-11T19:00:42.963 回答
4

有个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]
于 2017-05-22T02:06:36.223 回答
1

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

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']
于 2016-07-22T04:58:57.937 回答
1
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  )]
于 2017-10-09T14:41:10.650 回答
1
# 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']
于 2020-06-07T22:16:27.577 回答
0

对于喜欢它更具可读性的家伙来说:

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']
于 2015-10-07T18:38:37.507 回答
0

我的解决方案

   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']
于 2016-03-25T22:49:18.950 回答
0

在许多情况下都需要字符串拆分,例如您必须对给定字符串的字符进行排序,用另一个字符替换一个字符等。但是所有这些操作都可以使用以下提到的字符串拆分方法执行。

字符串拆分可以通过两种方式完成:

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

  2. 使用 list(str) 函数将给定的字符串转换为列表,其中字符串的字符分解为列表的元素。然后进行所需的操作,并用'原始字符串的字符之间的指定字符'.join(list)将它们连接起来,以获得一个新的处理字符串。

于 2016-12-01T06:49:02.403 回答
0
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)
于 2016-12-01T07:07:00.120 回答