>>> s = "'8255'"
>>> int(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: "'8255'"
是否有一个方便的函数可以采用常规字符串或这种双字符串,例如,并产生整数。
>>> s = "'8255'"
>>> int(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: "'8255'"
是否有一个方便的函数可以采用常规字符串或这种双字符串,例如,并产生整数。
>>> 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
其他一些选项包括:
>>> 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
是唯一一个随着数字变长而变慢的。从这里你会得到什么,我只是好奇地看到结果,并认为其他人可能也是如此。
尝试使用内置函数eval
:
new_s = int(eval(s))
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
你可以eval
这样使用:
>>> s = "'8255'"
>>> int(eval(s))
8255
这也适用于常规字符串:
>>> s = '8225'
>>> int(eval(s))
8255
如果您想删除更多 " 和 ' 使用嵌套的eval
.
尝试剥离不需要的字符:
int(s.strip("\'"))
您正在做的似乎是解析另一个文字中包含的文字。
虽然eval(eval("'123'"))
可以解决问题,eval
但通常应避免使用,因为它还会执行表达式中的任意代码。
幸运的是,有一个可用的标准模块可以进行精确评估:ast - 抽象语法树:
from ast import literal_eval
number = literal_eval(literal_eval(s))