例如,我有:將字符串分割成一個列表(而不是分隔相鄰的數字)在Python
string = "123ab4 5"
我希望能夠得到以下列表:
["123","ab","4","5"]
而比list(字符串)給我:
["1","2","3","a","b","4"," ","5"]
例如,我有:將字符串分割成一個列表(而不是分隔相鄰的數字)在Python
string = "123ab4 5"
我希望能夠得到以下列表:
["123","ab","4","5"]
而比list(字符串)給我:
["1","2","3","a","b","4"," ","5"]
找到一個或多個相鄰數字(\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']
你不需要在那裏有'\ s',你不應該使用'string'作爲變量名稱來映射內建函數。 - 另外,你的腳本不會捕獲空間字符。 –
@InbarRose'string'不是內建的(爲此目的,它是一個不推薦使用的模塊) - 並且'import string'很少使用......它更常用於'from string import'這裏常數或maketrans –
@john - 你是對的,我的道歉。似乎我也誤解了這個問題。你有這個問題的正確解決方案。 :) +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']
「如果你想要更簡單的東西......」 - 喜歡它。 –
@JohnKugelman哈哈,想要確保每個人都知道這是一個可怕的解決方案(儘管這很明顯:)) – RocketDonkey
你可以這樣做:
>>> [el for el in re.split('(\d+)', string) if el.strip()]
['123', 'ab', '4', '5']
這不會正確地拆分'a b c'。 –
@JohnKugelman是真實的,但是既然給了這個問題,它是否應該或不是...... –
這會給你想要的分裂:什麼是
re.findall(r'\d+|[a-zA-Z]+', "123ab4 5")
['123', 'ab', '4', '5']
規則是什麼? [你有什麼嘗試](http://whathaveyoutried.com)到目前爲止? – Aprillion