2017-08-30 167 views
0

我有一個字符串'1234567890',我想將它們分成三組,從右到左開始,最左邊的組從一個數字到3 -digits(取決於剩餘的數字)使用正則表達式從右到左將數字拆分爲三組,從右到左

實質上,它與向長數字添加逗號的過程相同,除了我也想提取最後三位數字。

我嘗試使用環視,但無法找出方法來獲得最後三個 數字。

string = '1234567890' 
re.compile(r'\d{1,3}(?=(?:\d{3})+$)') 
re.findall(pattern, string) 

['1', '234', '567'] 

預期成果是(我不需要逗號):

['1', '234', '567', 789] 

回答

2

認識到,如果我們添加逗號從右到左,每個組的三個完整的數字,那麼我們就可以簡單地做一個正則表達式用三個數字後面跟一個逗號替換全部三位數字。在下面的代碼片段中,我將字符串反轉,做逗號工作,然後再次反轉以獲得我們想要的輸出。

string = '1234567890' 
string = re.sub(r'(?=\d{4})(\d{3})', r'\1,', string[::-1])[::-1] 
print string.split(',') 
string = '123456789' 
string = re.sub(r'(?=\d{4})(\d{3})', r'\1,', string[::-1])[::-1] 
print string.split(',') 

輸出:用於替換可能需要進一步解釋的正則表達式的

['1', '234', '567', '890'] 
['123', '456', '789'] 

一部分。我在該模式的開頭添加了一個積極的lookahead (?=\d{4})。這是爲了確保我們不會在發生最後一組三位數字後添加逗號。

演示在這裏:

Rextester

+0

感謝這個,但有沒有辦法讓這樣的形式輸出:'['1','234','567',789]'。我不需要整個字符串在兩者之間用逗號返回。我希望輸出是三人組。對困惑感到抱歉。我更新了OP。 – Moondra

+0

@Mondond當然,你可以稍微修改我的原始答案,並使用'string.split(',')'來獲取數字中逗號分隔的數組值。 –

+0

@謝謝!我忘記了分裂。 – Moondra

2

它實際上是更容易在扭轉字符串操作來跟蹤3位組,其中有更多的數字去(與(?=\d)積極前瞻的:

for s in ('123','1234','123456789','1234567890'): 
    print(re.sub(r'(\d\d\d)(?=\d)',r'\1,',s[::-1])[::-1]) 

或負前瞻版本:

for s in ('123','1234','123456789','1234567890'): 
    print(re.sub(r'(\d\d\d)(?!$)',r'\1,',s[::-1])[::-1]) 

或者打印:

123 
1,234 
123,456,789 
1,234,567,890 

上扭轉串施加反向正則表達式被稱爲在sexeger的Perl ;-)

你也可以做到這一點並不需要扭轉串一個超前的版本:

for s in ('123','1234','123456789','1234567890'): 
    print(re.sub(r'(\d)(?=(\d{3})+$)',r'\1,',s)) 
# same output 

基礎上的評論,只需添加一個適當的刪除imiter然後對.split

>>> for s in ('123','1234','123456789','1234567890'): 
...  re.sub(r'(\d)(?=(\d{3})+$)',r'\1\t',s).split('\t') 
... 
['123'] 
['1', '234'] 
['123', '456', '789'] 
['1', '234', '567', '890'] 

或者跳過正則表達式,只是做在Python:

for s in ('123','1234','123456789','1234567890'): 
    s=s[::-1] 
    n=3 
    print([s[i:i+n][::-1] for i in range(0,len(s),n)][::-1]) 
# same output 
+0

早些時候打電話給你的道歉+1 ......我認爲你的正則表達式選項不涉及反轉(然後取消反轉)字符串,這是迄今爲止給出的最佳答案,當然在性能方面。 –

+0

@dawg謝謝你。但有沒有辦法以這種形式得到輸出:'['1','234','567',789]'。我不需要整個字符串在兩者之間用逗號返回。我希望輸出是三人組。 – Moondra

+0

@TimBiegeleisen:謝謝。它實際上可能*不是最好的表現。閱讀[sexeger](http://www.perlmonks.org/index.pl?node=sexeger)(在Perl中)進行比較。底線,它取決於正則表達式引擎和字符串反轉的速度。 – dawg