2

我的语言是蟒蛇

输入看起来像:

'0 0 0 0 1 0 0 0 1 1 0 0' 

等等。

我想要输出:

('0 0 0 0', '1 0 0 0', '1 1 0 0') 

或者每组 4 个数字都是它自己的元素

到目前为止,我已经放在一起

>>> truth = re.compile('(([0-1]\D*?){4})*')
>>> truth.search('0 0 0 0 1 0 0 0').groups()
('0 0 0 0', '0')

或和几个类似的事情,但没有什么越来越接近。这里的一些东西对我来说是新的,我正在阅读文档,但似乎无法将分崩离析的东西拼凑起来。值得注意的是,我现在不知道为什么我得到最后一个 0 ...

输入最终将有很多行,但如果它适用于小案例,我相信它会翻译过来。

谢谢

4

5 回答 5

6

我不会为此使用正则表达式。而是使用itertools文档grouper中的配方

>>> [' '.join(x) for x in grouper(4, truth.split())]

在线查看它:ideone


这是(从 itertools 文档复制)的源代码grouper

from itertools import izip_longest

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)
于 2012-05-12T06:25:27.947 回答
3

我不是很精通 Python,但你可以稍微改变你的正则表达式并re.findall()改用它。

re.findall('(?:[0-1]\s*){4}', '0 0 0 0 1 0 0 0 1 1 0 0')
于 2012-05-12T06:29:48.173 回答
1

您应该检查列表理解

>>> MyString = '0 0 0 0 1 0 0 0 1 1 0 0'
>>> [MyString[x:x+7] for x in range(0,len(MyString),8)]
>>> ['0 0 0 0', '1 0 0 0', '1 1 0 0']
于 2012-05-12T06:25:17.167 回答
1

这样做:

>>> s='0 0 0 0 1 0 0 0 1 1 0 0' 
>>> [' '.join(x) for x in zip(*[iter(''.join(s.split()))]*4)]
['0 0 0 0', '1 0 0 0', '1 1 0 0']

如果你想要一个元组:

>>> tuple(' '.join(x) for x in zip(*[iter(''.join(s.split()))]*4))
('0 0 0 0', '1 0 0 0', '1 1 0 0')

如果你真的想要一个正则表达式:

>>> [x.strip() for x in re.findall(r'(?:\d\s*){4}',s)]
['0 0 0 0', '1 0 0 0', '1 1 0 0']
于 2012-05-12T07:09:31.567 回答
0

一个疯狂的解决方案只是为了好玩:

import math
s = '0 0 0 0 1 0 0 0 1 1 0 0'
step = 8
result = [s[0+i*step:step+i*step] for i in xrange(int(math.ceil(float(len(s))/step)))]
print result
于 2012-05-12T08:23:05.743 回答