用于计算的Python解析器

2024-10-02 10:26:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

表达式可以是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


Tags: 文件theinretxtfor表达式运算符
1条回答
网友
1楼 · 发布于 2024-10-02 10:26:37

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

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

前三行只是一些初始的东西。之后,我将在第四行使用regex创建一个堆栈。(?:[A-Z])匹配变量,(?:[0-9]+)匹配数字(可能有多个数字),(?:[/*+_=\(\)-])匹配所有运算符。大括号被转义,并且-在末尾,所以您不必转义它。在

第五行和第六行打印堆栈。在

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

相关问题 更多 >

    热门问题