【问题标题】:Python parser for Calculator [duplicate]计算器的Python解析器[重复]
【发布时间】:2013-03-28 13:01:54
【问题描述】:

我正在尝试编写一个解析器,它将表达式作为文件的输入。

表达式可以是 A=B=10 或 B=(C-A)-4 等。

到目前为止,我尝试过的是 .我正在读取一个文件 IP.txt

import re

opert = '+-/*()_='
fileName = "input.txt"
f = open(fileName,'r')

variableDict = {}
lines = f.readlines()

for i in lines:

    for x in  re.finditer(r'[A-Z_]\w*', i):
        print x.group() # prints list containing all the alphabets.

    for z in  re.finditer(r'[0-9]\d*', i):
        print z.group() # prints list containing all the numbers.

    for c in i:
        if c in opert:
            print c # prints all the operators.

   # '_' has special meaning. '_' can only be used before numbers only like _1 or _12 etc
   #And i have parsed this also using
       print re.findall(r'[_][0-9]\d+',i) # prints the _digits combination.

现在的问题是我应该如何进行表达式评估。 首先,我必须提到的关于上述输入的一些规则是。 任何行不得超过 50 个字符。 最左边的运算符将始终是 '=' 赋值运算符。 '=' 总是以变量[A-Z] 开头,运算符为{'+','-','/','*','_'},数字{0-9}。

我应该如何先提取第一个变量然后将其推入python列表然后'='运算符,然后要么'(','A-Z'将其推入堆栈等等

谁能帮我解决这个问题。我被问题弄得不知所措..

如果有看不懂的请goto this link

【问题讨论】:

  • 你需要在那里修复你的缩进。混合制表符和空格确实不适用于 Stack Overflow。
  • 抱歉格式化,我是stackoverflow的新手,学习如何正确使用它。

标签: python regex stack automata


【解决方案1】:

所以,您询问了堆栈问题,当然您需要评估。我会这样做:

import re #1
stack = [] #2 FIX: NOT NECESSARY (since fourth line returns a list anyway)
inputstr = "A=B=C+26-(23*_2 )-D" #3

stack =  re.findall(r'(?:[A-Z])|(?:[0-9]+)|(?:[/*+_=\(\)-])', inputstr) #4

while len(stack): #5
    print stack.pop() #6

前三行只是一些初始化内容。在那之后,我会在第四行用正则表达式做一个堆栈。 (?:[A-Z]) 匹配变量,(?:[0-9]+) 匹配数字(可能不止一位),(?:[/*+_=\(\)-]) 匹配所有运算符。大括号被转义了,- 在最后,所以你不必转义它。

第五和第六行打印堆栈。

我使用了(?: ...),因为我不想匹配任何一个组。很难解释 - 尝试在没有 ?: 的情况下运行它,您就会看到效果。

【讨论】:

  • 谢谢,我正在尝试你的方法..我希望它能解决我的问题..再次感谢..
  • 您不需要事先指定stack...另外,只需解释一下正则表达式是什么就足够了。
  • 第二行你说得对——我现在就修。当然,我解释的正则表达式就足够了——因为有了这个正则表达式,他可以只在一行代码中创建一个用于评估的堆栈。整个那行的意思实际上就是那个正则表达式(其余代码对功能并不重要)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
相关资源
最近更新 更多