将Python中的字符串拆分为具有恒定长度但右对齐的块

时间:2015-06-17 15:48:09

标签: python string slice

基本上,我有一个像" 12345678"并且需要一个包含此信息的列表,但需要拆分为长度为3的子字符串。问题是,我需要将其右对齐,因此输出必须为['12', '345', '678']而不是['123', '456', '78']
如何使用少量代码行最好地实现,最好不需要额外的导入?

2 个答案:

答案 0 :(得分:3)

很容易调整How do you split a list into evenly sized chunks?的最佳答案:

def chunks_rightaligned(l, n):
    orphan = len(l) % n
    if orphan:
        yield l[:orphan]         
    for i in xrange(orphan, len(l), n):
        yield l[i:i+n]

首先产生一个剩余长度的块,然后从孤立大小而不是0开始以块大小步长迭代索引。

演示:

>>> def chunks_rightaligned(l, n):
...     orphan = len(l) % n
...     if orphan:
...         yield l[:orphan]         
...     for i in xrange(orphan, len(l), n):
...         yield l[i:i+n]
... 
>>> list(chunks_rightaligned("12345678", 3))
['12', '345', '678']
>>> list(chunks_rightaligned("1234567", 3))
['1', '234', '567']
>>> list(chunks_rightaligned("123456", 3))
['123', '456']

答案 1 :(得分:1)

如果您想尝试正则表达式,可以使用re.split()函数

>>> re.split(r"(...)(?=(?:\d\d\d)+$)","12345678")
['12', '345', '678']

>>> re.split(r"(...)(?=(?:\d\d\d)+$)","123")
['123']

修改

更好的解决方案是使用re.findall()

>>> re.findall(r"\d{1,3}(?=(?:\d{3})*$)", "12345")
['12', '345']

>>> re.findall(r"\d{1,3}(?=(?:\d{3})*$)", "123456")
['123', '456']

>>> re.findall(r"\d{1,3}(?=(?:\d{3})*$)", "1234567")
['1', '234', '567']

它的作用是什么?

  • \d{1,3}匹配最多3个字符,最少1个字符。

  • (?=(?:\d{3})*$)积极向前看。确保匹配的字符后跟3位数的倍数。

    • (?:\d{3})匹配3位数。

您可以在regex字符串中使用变量来生成变量数据块。

示例

>>> $limit=4
>>> regex = r"\d{1,%d}(?=(?:\d{%d})*$)" %(limit,limit)
>>> re.findall(regex, "1234567")
['123', '4567']

>>> limit=3
>>> regex = r"\d{1,%d}(?=(?:\d{%d})*$)" %(limit,limit)
>>> re.findall(regex, "1234567")
['1', '234', '567']