>>> 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
危険です。これは、最適化されたソリューションではない可能性があります。しかし、安全で柔軟です。
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
:
new_s = int(eval(s))
不要な文字を削除してみてください:
int(s.strip("\'"))
あなたがしていることは、別のリテラルに含まれるリテラルを解析しているようです。
whileeval(eval("'123'"))
はトリックを行いeval
ますが、式内の任意のコードも実行するため、通常は避ける必要があります。
幸いなことに、正確な評価を行う標準モジュールが利用可能です: ast - Abstract Syntax Trees :
from ast import literal_eval
number = literal_eval(literal_eval(s))
eval
次のように使用できます。
>>> s = "'8255'"
>>> int(eval(s))
8255
これは通常の文字列でも機能します。
>>> s = '8225'
>>> int(eval(s))
8255
もっと削除したい場合は、「ネストされた」を使用してeval
ください。