从具有空格的字符串解析int不同于py2到py3

时间:2017-10-17 10:10:06

标签: python string int python-2to3

将带有空格的字符串解析为整数,从Python2更改为Python3。

在Python2中它是:

>>> int('-11')
-11
>>> int('- 11')
-11

而在Python3中:

>>> int('-11')
-11
>>> int('- 11')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '- 11'

一旦我弄明白这一点,我试图找到一些关于文档中这种变化的解释/解释,但是找不到任何东西。

所以我的问题是:如何修改从py2迁移到py3的代码? i = int(s.replace(' ',''))是可行的吗?或者有更好的建议吗?是否有一些我刚才找不到的改变的描述?

3 个答案:

答案 0 :(得分:4)

这在Python 3中明确更改以响应this article

  

我发现在将字符串转换为int或float时,int   转换允许符号后的空格,而浮点转换   没有按&#39;吨。我认为它们应该是一致的。

issue 1779(发行号中有拼写错误)中注明了这一点:

  
      
  • 问题#1769:现在不再允许int(&#34; - 1&#34;)。
  •   

允许空格与其他数字转换不一致。

解决此问题的最快方法是使用str.replace(),是:

>>> import timeit
>>> timeit.timeit('int("- 1".replace(" ", ""))')
0.37510599600500427
>>> timeit.timeit('int("- 1".translate(map))', 'map = {32: None}')
0.45536769900354557
>>> timeit.timeit('literal_eval("- 1")', 'from ast import literal_eval')
6.255796805999125
>>> timeit.timeit('int(extract("- 1"))', 'import re; from functools import partial; extract = partial(re.compile(r"[^\d\.\-]").sub, "")')
0.7367695900029503

Python 2.7文档3.0a3 changelog,通过向后移植Python 3文档。它现在明确指出在符号和数字之间不应该有空格。所以正式,不再支持空白,但为了不破坏向后兼容性,错误就留在了。

答案 1 :(得分:2)

看起来字符串文字中的空格不会在Python 3中被丢弃,但是,当在数字文字中找到时,Python解析器仍然会忽略空格:

>>> e = -   11
>>> e
-11

因此,您可以在Python 2和3中的输入字符串上直接使用ast.literal_eval,因此会忽略空格:

>>> import ast
>>> ast.literal_eval('-      11 ')
-11

答案 2 :(得分:0)

不重新发明轮子。对于PY2&amp;&amp; PY3

import re
int(re.sub(r'[^\d\-]', '', '- 11'))

测试

>>> int(re.sub(r'[^\d\.\-]', '', '- 11'))
-11
>>> int(re.sub(r'[^\d\.\-]', '', '+ 11'))
11
>>> int(re.sub(r'[^\d\.\-]', '', '+ 11easd'))
11
>>> int(re.sub(r'[^\d\.\-]', '', '+ 11easd3325'))
113325