2015-08-09 56 views
1

這是我的代碼Python的奇怪的錯誤使用正則表達式

>>> string="a 32GB 512MB " 
>>> regex="(\d{1,4})(,|.){0,1}(\d{1,2}){0,1}\s*(KB|MB|GB)" 
>>> import re 
>>> res = re.findall(regex, string, re.IGNORECASE) 
>>> print res 
[('32', '', '', 'GB'), ('512', '', '', 'MB')] 
>>> res=res[len(res)-1] 
>>> print res 
('512', '', '', 'MB') 
>>> res="".join(res[0]) 
>>> print res 
512 

我不明白爲什麼

res="".join(res[0]) 

返回512,而不是512MB

+1

恕我直言,並不奇怪。您只加入元組中的第一個字符串。做'res =「」。join(res)' – ozgur

回答

0

問題是與URS的這種說法

res="".join(res[0]) 

這是因爲你已經做了

res=res[len(res)-1] 

這使得res = ('512', '', '', 'MB')

你只需要joinresres[0]res[0]512

您可以檢查這樣

string="a 32GB 512MB " 
regex="(\d{1,4})(,|.){0,1}(\d{1,2}){0,1}\s*(KB|MB|GB)" 
import re 
res = re.findall(regex, string, re.IGNORECASE) 

print "".join(res[0]) 
print "".join(res[1]) 
0

您需要刪除索引的索引指定,即只提取第一個元素的[0]

res = "".join(res) 

如果您將所有捕獲組設置爲非捕獲組,則必須在未加入的情況下獲得所需的輸出。

regex = r"\b\d{1,4}[,.]?(?:\d{1,2})?\s*(?:KB|MB|GB)\b" 

實施例:

>>> import re 
>>> string="a 32GB 512MB " 
>>> res = re.findall(r"\b\d{1,4}[,.]?(?:\d{1,2})?\s*(?:KB|MB|GB)\b", string, re.I) 
>>> res 
['32GB', '512MB'] 
>>> res[-1] 
'512MB' 
>>> 
0

res[0]是字符串'512'。由於字符串是可迭代的,因此您可以使用str.join。在這種情況下,您將使用空字符串來加入每個字符,從而產生原始字符串。

看來你要加入整個數組:''.join(res)