2013-10-11 104 views
2

如何使用正則表達式來分割每行Python的正則表達式來分割線分成4個部分

3 Name Test 50.5 - 
2 Name-Test - 3.12 
1 Name Test Test 50.5 - 
2 Name Test 32 213.12 
3 Name Test 50.5 - 
2 Name Test - 50.12 
1 Name Test 50.5 - 
2 Name Test - - 

將分爲以下:

3 | Name Test | 50.5 | - 
2 | Name-Test | - | 3.12 
1 | Name Test Test | 50.5 | - 
2 | Name Test | 32 | 213.12 
3 | Name Test | 50.5 | - 
2 | Name Test | - | 50.12 
1 | Name Test | 50.5 | - 
2 | Name Test | - | - 

我最遠的是:re.compile('(\d+) (.+) (\w+.\w+)')

無論何處|符號是分裂需要的地方...

+0

這是匹配,而不是分裂(拆分將're.split')。 –

+0

你的名字測試部分是否可以包含數字?像 - '名稱 - 測試23測試'? –

+0

'Name Test'部分可以包含數字yes可以是'Test22Test'或'Test 22 Test'或'Test 22-Test'或'Test-22-Test'等所有版本 – Ryflex

回答

1

試試這個:^(\d+) (.+) (\d+\.\d+|-|\d+) (\d+\.\d+|-|\d+)$

這應該匹配所有示例字符串。

一切順利SMNALLY

2

一個潛在的合適的正則表達式來匹配將是:

^(\d+) (.+) (\d+(\.\d+)?|-) (\d+(\.\d+)?|-)$ 

實例:

>>> re.match(r'(\d+) (.+) (\d+(\.\d+)?|-) (\d+(\.\d+)?|-)$', '3 Name Test 50.5 -').groups() 
('3', 'Name Test', '50.5', '-') 
+0

我試過了:'re.compile ('(\ d +)(。+)(。+)(。+)'這個缺點是什麼?) – Ryflex

+0

@Hyflex:如果你不確定,你可能還沒有準備好使用正則表達式。我建議你讀一下他們,它會真正的回報。 –

+0

我已經讀過他們只是不100%理解他們,我仍然在學習 – Ryflex

3

好的,這是另一種方法。這是基於您的特定用例的「分裂」,並且不涉及正則表達式。關鍵的想法是第二列(名稱)可以有空格,而其他所有列都有明確的格式。這樣的想法是從右側分裂和離開,留下其餘的(名字列)完整:

def mysplit(line): 
    r = line.rsplit(' ', 2) 
    l = r[0].split(' ', 1) 
    print " | ".join(l + r[i:]) 

當我運行在IPython中下面的代碼片段與您輸入/tmp/lines.txt

for l in open('/tmp/lines.txt'): 
    mysplit(l.strip()) 

結果:

 
3 | Name Test | 50.5 | - 
2 | Name-Test | - | 3.12 
1 | Name Test Test | 50.5 | - 
2 | Name Test | 32 | 213.12 
3 | Name Test | 50.5 | - 
2 | Name Test | - | 50.12 
1 | Name Test | 50.5 | - 
2 | Name Test | - | - 
+0

我想到了這種方法(並傾向於更喜歡)但是卻懶得去做,但是我認爲他試圖從中得到一個元組;'|'分離只是表示分裂點。 –

+0

對於一個元組,tuple(l + r [我:]'應該這樣做,而不是打印...... – scorpiodawg