2012-11-19 38 views

回答

8

找到一個或多個相鄰數字(\d+),或者如果失敗找非數碼網絡t,非空格字符([^\d\s]+)。

>>> string = '123ab4 5' 
>>> import re 
>>> re.findall('\d+|[^\d\s]+', string) 
['123', 'ab', '4', '5'] 

如果你不想字母結合在一起做,試試這個:

>>> re.findall('\d+|\S', string) 
['123', 'a', 'b', '4', '5'] 
+0

你不需要在那裏有'\ s',你不應該使用'string'作爲變量名稱來映射內建函數。 - 另外,你的腳本不會捕獲空間字符。 –

+0

@InbarRose'string'不是內建的(爲此目的,它是一個不推薦使用的模塊) - 並且'import string'很少使用......它更常用於'from string import'這裏常數或maketrans –

+0

@john - 你是對的,我的道歉。似乎我也誤解了這個問題。你有這個問題的正確解決方案。 :) +1 –

0

,你可以在這裏做一些事情,你可以

1.迭代列表和使隨時隨地進行數字分組,將它們附加到結果列表中。

不是一個很好的解決方案。

2.使用正則表達式。

執行2:

>>> import re 
>>> s = "123ab4 5" 
>>> re.findall('\d+|[^\d]', s) 
['123', 'a', 'b', '4', ' ', '5'] 

你想抓住任何一組至少爲1號\d+或任何其他字符。

編輯

約翰打我正確solution第一。其精彩的solution

我會在這裏留下這個,雖然因爲別人可能會誤解這個問題,並尋找我認爲寫的東西的答案。我在OP的想法下只想捕捉一組數字,並留下一切個人。

1

其他解決方案肯定更容易。如果你想遠不如直接的東西,你可以嘗試這樣的事:

>>> import string 
>>> from itertools import groupby 
>>> s = "123ab4 5" 
>>> result = [''.join(list(v)) for _, v in groupby(s, key=lambda x: x.isdigit())] 
>>> result = [x for x in result if x not in string.whitespace] 
>>> result 
['123', 'ab', '4', '5'] 
+0

「如果你想要更簡單的東西......」 - 喜歡它。 –

+0

@JohnKugelman哈哈,想要確保每個人都知道這是一個可怕的解決方案(儘管這很明顯:)) – RocketDonkey

1

你可以這樣做:

>>> [el for el in re.split('(\d+)', string) if el.strip()] 
['123', 'ab', '4', '5'] 
+0

這不會正確地拆分'a b c'。 –

+0

@JohnKugelman是真實的,但是既然給了這個問題,它是否應該或不是...... –

0

這會給你想要的分裂:什麼是

re.findall(r'\d+|[a-zA-Z]+', "123ab4 5") 

['123', 'ab', '4', '5'] 
相關問題