Pythonic方法将字符串中的所有八进制值作为整数进行评估

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)


gri*_*ton 5

您可以使用lstrip()在一行中执行此操作以去除任何前导零:

>>> eval("".join(token.lstrip('0') for token in s.split()))
37
Run Code Online (Sandbox Code Playgroud)

  • 怎么样`s ='0*10'`? (2认同)