以整数形式计算字符串中所有八进制值的Python方法
例如,我有一个字符串看起来像以整数形式计算字符串中所有八进制值的Python方法,python,string,eval,Python,String,Eval,例如,我有一个字符串看起来像“012+2-01+24”。我希望能够快速(更少的代码)计算该表达式 我可以对字符串使用eval(),但我不希望012以八进制形式(10)表示,我希望它以int(12)表示 我的解决方案是可行的,但并不优雅。我在某种程度上假设有一种很好的蟒蛇式方法可以做到这一点 我的解决方案: #expression is some string that looks like "012 + 2 - 01 + 24" atomlist = [] for atom in express
“012+2-01+24”
。我希望能够快速(更少的代码)计算该表达式
我可以对字符串使用eval(),但我不希望012
以八进制形式(10)表示,我希望它以int(12)表示
我的解决方案是可行的,但并不优雅。我在某种程度上假设有一种很好的蟒蛇式方法可以做到这一点
我的解决方案:
#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)
基本上,我撕开字符串,找到其中的数字并将其转换为整数,然后用整数重新生成字符串(基本上删除前导0,除非0本身是一个数字)
如何才能做得更好?我很想使用正则表达式来删除前导零:
>>> re.sub(r'\b0+(?!\b)', '', '012 + 2 + 0 - 01 + 204 - 0')
'12 + 2 + 0 - 1 + 204 - 0'
这将删除每个数字开头的零,除非该数字完全由零组成:
- 第一个
匹配单词(标记)边界李>\b
匹配一个或多个连续零李>0+
()禁止在零序列后跟令牌边界的情况下进行匹配(?!\b)
split()
>>> re.sub(r'\b0+(?!\b)', '', '012+2+0-01+204-0')
'12+2+0-1+204-0'
可以使用lstrip()在一行中删除任何前导零:
>>> eval("".join(token.lstrip('0') for token in s.split()))
37
我想这样做:
>>> s = '012 + 2 + 0 - 01 + 204 - 0'
>>> ' '.join(str(int(x)) if x.isdigit() else x for x in s.split())
'12 + 2 + 0 - 1 + 204 - 0'
如果您也要处理它们,请使用float()
)int
不假定前导零表示八进制数:
In [26]: int('012')
Out[26]: 12
因此,您可以使用以下代码安全地计算表达式
from operator import add, sub
from collections import deque
def mapper(item, opmap = {'+': add, '-': sub}):
try: return int(item)
except ValueError: pass
return opmap[item]
stack = deque()
# if item filters out empty strings between whitespace sequences
for item in (mapper(item) for item in "012 + 2 - 01 + 24".split(' ') if item):
if stack and callable(stack[-1]):
f = stack.pop()
stack.append(f(stack.pop(), item))
else: stack.append(item)
print stack.pop()
不是一行程序,但它是安全的,因为您可以控制所有可以执行的函数。这一点很好!我不确定用我的方法有什么简单的方法来解决这个问题。无论如何,我都希望得到一个好的答案。在我的特殊情况下,唯一的操作是+和-解决问题的一种方法是使用token.lstrip('0'),如果token.lstrip('0')else token
或其他什么。我需要开始学习常规表达式的另一个原因是:eval('012')
将在Python 3中引发一个SyntaxError
:)@RikPoggi:这是一个非常有趣的旁注…+1出于自私的原因;这是我想到的第一件事。