2012-05-12 127 views
2

我的語言是Python簡單的regex麻煩

輸入看起來像:

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

輸入最終會有許多行,但如果它適用於小案例我相信它會翻譯。

感謝

+2

你必須用正則表達式來做這個嗎?如果使用'.split()'和'.join()',可能會更簡單。 –

+0

很多很好的答案,我沒有想到要問的問題。你指出我沒有必要使用正則表達式。 –

回答

6

我不會用正則表達式這一點。而是使用grouperrecipesitertools documentation

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

看到它聯機工作:ideone


下面是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) 
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'] 
+2

最好不要將變量命名爲'string'模塊 – jamylak

+0

好點,更改爲標準的「MyX」格式。 – Josiah

3

我對Python不是很瞭解,但是你可以稍微改變一下你的正則表達式,並用re.findall()來代替。

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

+1如果它必須是一個正則表達式,這將起作用。 –

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