我正在尝试编写一个解析器,它将表达式作为文件的输入。
表达式可以是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
答案 0 :(得分: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]+)
匹配数字(可能有多个数字),(?:[/*+_=\(\)-])
匹配所有运算符。大括号被转义,-
就在最后,所以你不必逃避它。
第五行和第六行打印堆栈。
我使用(?: ...)
,因为我不想匹配任何一组。很难解释 - 只是尝试在没有?:
的情况下运行它,你会看到效果。