简单的正则表达式麻烦

时间:2012-05-12 06:17:22

标签: python regex

我的语言是python

输入看起来像:

'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 ...

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

感谢

5 个答案:

答案 0 :(得分:6)

我不会为此使用正则表达式。而是使用recipes上的itertools documentation中的grouper

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

查看在线工作:ideone


以下是grouper的源代码(从itertools文档中复制):

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)

答案 1 :(得分:3)

我不是非常狡猾的Python,但你可以稍微改变你的正则表达式并改用re.findall()

re.findall('(?:[0-1]\s*){4}', '0 0 0 0 1 0 0 0 1 1 0 0')

答案 2 :(得分:1)

您应该查看list comprehension

>>> 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']

答案 3 :(得分: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']

答案 4 :(得分: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