双字符串到int

时间:2012-11-23 11:39:10

标签: python

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

是否有一个方便的函数,它将采用常规字符串,或者像示例中那样的双字符串,并生成整数。

7 个答案:

答案 0 :(得分:3)

>>> import ast
>>> s = "'8255'"
# note - this still works if it was '"8255"'
>>> ast.literal_eval(s)
'8255'
>>> int(ast.literal_eval(s))
8255

它还有一个优点,即给定的东西已经是一个int ...

>>> s = '8255'
>>> type(ast.literal_eval(s))
<type 'int'>

你自动回来一个int ...

请参阅:http://docs.python.org/2/library/ast.html#ast.literal_eval

答案 1 :(得分:2)

其他一些选项包括:

>>> import re
>>> s = "'8255'"
>>> s = int(re.sub("\D", "", s))

>>> s = "'8255'"
>>> s = int(filter(lambda x: x.isdigit(), s))'

出于好奇,

编辑: 我决定测试一些建议选项的时间。

def reMethod(s):
    import re
    return int(re.sub("\D", "", s))

def filterMethod(s):
    return int(filter(lambda x: x.isdigit(), s))

def evalMethod(s):
    return int(eval(s))

def literalMethod(s):
    import ast
    return int(ast.literal_eval(s))

def stripMethod(s):
    return int(s.strip("\'").strip("\""))

if __name__=='__main__':
    from timeit import Timer
    s = ...
    t1 = Timer(lambda: reMethod(s))
    t2 = Timer(lambda: filterMethod(s))
    t3 = Timer(lambda: evalMethod(s))
    t4 = Timer(lambda: literalMethod(s))
    t5 = Timer(lambda: stripMethod(s))
    print t1.timeit(number=10000)
    print t2.timeit(number=10000)
    print t3.timeit(number=10000)
    print t4.timeit(number=10000)
    print t5.timeit(number=10000)

s小(4位)时的输出:

reMethod = 0.0482196671653
filterMethod = 0.0266420145487
evalMethod = 0.0923773329062
literalMethod = 0.108779595759
stripMethod = 0.0165356828523

s大(150位)时的输出:

reMethod = 0.068626707014
filterMethod = 0.28342855188
evalMethod = 0.116445492177
literalMethod = 0.134001262669
stripMethod = 0.0227778106058

当s非常大(7500位)时的输出:

reMethod = 4.40808699357
filterMethod = 16.7396360029
evalMethod = 4.72486805726
literalMethod = 4.52914962633
stripMethod = 3.65296183068

总的来说,他们的表现似乎并没有那么大差别。 filter是唯一一个随着数字变长而变慢的人。从你的意愿出发,我只是好奇地看到结果,并认为其他人也可以。

答案 2 :(得分:1)

尝试使用内置函数eval

new_s = int(eval(s))

答案 3 :(得分:1)

eval很危险。这可能不是最优化的解决方案。但是安全而灵活。

import re

s = "'8255'"

def find_ints(s):
    m = re.search('\d+', s)
    if m:
        return int(m.group(0))
    return None

find_ints(s)
Out[4]: 8255

答案 4 :(得分:0)

您可以像这样使用eval

>>> s = "'8255'"
>>> int(eval(s))
8255

这也适用于常规字符串:

>>> s = '8225'
>>> int(eval(s))
8255

如果您想删除更多“和”使用嵌套eval

答案 5 :(得分:0)

尝试剥离不受欢迎的字符:

int(s.strip("\'"))

答案 6 :(得分:0)

您正在做的事情似乎是解析另一个文字中包含的文字

虽然eval(eval("'123'"))可以解决问题,但通常应该避免使用eval,因为它还会执行表达式中的任意代码。

幸运的是,有一个标准模块可以进行精确评估:ast - Abstract Syntax Trees

from ast import literal_eval
number = literal_eval(literal_eval(s))