使用Python程序计算文件中的括号?

xnobis 发布于 2019-11-10 exception 最后更新 2019-11-10 12:10 290 浏览

我想通过它来修复一个函数,我可以计算使用了多少次:(,),[,] 如果计数(等于那些) 如果[的数量等于] 那么我有有效的语法! 我的第一个 - 替代者 - 尝试:

filename=input("Give a file name:")
def  parenthesis(filename):
    try:
        f=open(filename,'r')
    except (IOError):
        print("The file",filename,"does not exist!False! Try again!")
    else:
         while True:
            for line in filename:
                line=f.readline()
                if line=='(':
                     c1=line.count('(')
                elif line==')':
                     c2=line.count(')')
                elif line=='[':
                     c3=line.count('[')
                elif line==']':
                     c4=line.count(']')
                elif line=='':
                    break
if c1==c2:
                     print("Line: Valid Syntax")
                elif c1!=c2:
                     print("Line: InValid Syntax")
                elif c3==c4:
                     print("Line: Valid Syntax")
                elif c3!=c4:
                     print("Line: InValid Syntax")
    finally:
        f.close()
parenthesis(filename)
已邀请:

uid

赞同来自:

我相信,你正在寻找平衡的符号检查器。最好使用堆栈。

  1. 制作一个空堆,
  2. 对于字符串中的每个符号: 2.1如果符号是开头符号,请将其推入堆栈。 2.2如果它是结束符号,那么 2.2.1如果堆栈为空,则为false。 2.2.2如果堆栈顶部与结束符号不匹配,则返回false。 [如果要检查匹配的括号,请选中​​此步骤] 2.2.3弹出堆栈。
  3. 如果堆栈为空则返回true,否则返回false。
心连心。

uaut

赞同来自:

内容太长未翻译

jculpa

赞同来自:

你想确保他们的parens&大括号匹配? “[(])”失败了吗?如果没有,那么你就是在正确的道路上,除了你需要将“=”改为“+ =”。您丢弃了之前行的值。

bnemo

赞同来自:

所有这些答案都是错误的,并不适用于所有情况,所以要么使用python解析器,例如tokenize等或者只是使用它 count = min(text.count(“(”),text.count(“)”))

laut

赞同来自:

我想如果你改变了:

            if line=='(':
                 c1=line.count('(')
            elif line==')':
                 c2=line.count(')')
            elif line=='[':
                 c3=line.count('[')
            elif line==']':
                 c4=line.count(']')
            elif line=='':
                break
类似于:
SearchFor = ['(', ')', '[', ']']
d = {}
for itm in SearchFor:
    d[itm] = line.count(itm)
# Then do the comparison
if d['['] == d[']'] and  d['('] == d[')']:
     print "Valid Syntax"
else:
     print "Invalid Syntax" #You could look at each to find the exact cause.
和其他人提到的While True:。我错过了。 :0)

ueaque

赞同来自:

删除'while True'行并且这一点:

elif line=='':
    break
然后替换这个:
for line in filename:
    line=f.readline()
有了这个:
for line in f:
现在,您将循环遍历文件中的行。 接下来,替换所有这些东西:
if line=='(':
    c1=line.count('(')
有:
    c1+=line.count('(')
if和elif行只是在你应该的时候阻止你计算。如果该行没有您要查找的内容,则计数将为0,这很好。 这应该至少让你更接近解决方案。

ea_qui

赞同来自:

我的解决方案将尝试帮助您了解更精确的方法,并希望您将了解过程中的数据结构。 要正确执行此操作,您将需要使用stack。您需要提取(,),[和]的所有实例(可能使用正则表达式...提示)并遍历生成的数组: 说你的文件是这样的:

(this [is] foobar)
你的正则表达式将产生这个数组:
['(', '[', ']', ')'] 
您将此数组的pop(0)放入堆栈。 在算法上: 1)将所有标签{(,),[,]}放在一个数组中。 2)对于数组中的每个元素,从中弹出(0)并将其推入堆栈。在它之前测试它。如果它在它之前关闭了元素,那么从数组中弹出两次(例如,如果你有'('在堆栈上,并且下一个要被推入堆栈的元素是')',')'关闭' (',所以你把它们都弹出来。)如果没有,继续。 3)如果你的数组是空的,当你的数组结束时你的堆栈是空的,那么你的文件就很好了。如果不是,那么你的文件格式很差{like(foo [bar]]}。 加成:正则表达式:REGEX = re.compile(r“\)\(\ [\ _ \”“),REGEX.findall(要搜索的字符串)。在Python here中查看有关正则表达式的更多信息。