2015-08-09 58 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)