Dre*_*ane 7 python string eval
所以我有一个看起来像一个字符串"012 + 2 - 01 + 24".我希望能够快速(减少代码)评估该表达式...
我可以在字符串上使用eval(),但我不想012以八进制形式(10)表示,我希望它表示为int(12).
我的解决方案有效,但不优雅.我有点假设有一种非常好的pythonic方法来做到这一点.
我的解决方案
#expression is some string that looks like "012 + 2 - 01 + 24"
atomlist = []
for atom in expression.split():
if "+" not in atom and "-" not in atom:
atomlist.append(int(atom))
else:
atomlist.append(atom)
#print atomlist
evalstring = ""
for atom in atomlist:
evalstring+=str(atom)
#print evalstring
num = eval(evalstring)
Run Code Online (Sandbox Code Playgroud)
基本上,我撕开appart字符串,并在其中找到数字并将它们转换为整数,然后我用int重建字符串(基本上删除前导0,除非0是一个数字本身).
怎么能做得更好?
NPE*_*NPE 10
我很想使用正则表达式来删除前导零:
>>> re.sub(r'\b0+(?!\b)', '', '012 + 2 + 0 - 01 + 204 - 0')
'12 + 2 + 0 - 1 + 204 - 0'
Run Code Online (Sandbox Code Playgroud)
这会在每个数字的开头删除零,除非数字完全由零组成:
\b匹配单词(标记)边界;0+匹配的一个或更多个连续的零;(?!\b)(负先行)抑制,其中零的序列之后是令牌边界匹配.这种方法split()基于替代方案的一个优点是它不需要空间才能工作:
>>> re.sub(r'\b0+(?!\b)', '', '012+2+0-01+204-0')
'12+2+0-1+204-0'
Run Code Online (Sandbox Code Playgroud)
您可以使用lstrip()在一行中执行此操作以去除任何前导零:
>>> eval("".join(token.lstrip('0') for token in s.split()))
37
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1335 次 |
| 最近记录: |