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

时间:2009-12-10 01:45:41

标签: python exception file parentheses

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

我的第一次 - 失败 - 尝试:

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)

7 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

我想如果你改变了:

            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)

答案 2 :(得分:1)

删除'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,这很好。

至少应该让你更接近解决方案。

答案 3 :(得分:1)

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

  1. 制作一个空堆栈,

  2. 对于字符串中的每个符号:

    2.1如果符号是开头符号,请将其推入堆栈。

    2.2如果是结束符号,那么

    2.2.1如果堆栈为空,则为false。

    2.2.2如果堆栈顶部与结束符号不匹配,则返回false。 [如果要检查匹配的大括号,请选中​​此步骤]

    2.2.3弹出堆栈。

  3. 如果堆栈为空,则返回true,否则返回false。

  4. 第h

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我的解决方案将尝试帮助您了解更精确的方法,并希望您将了解过程中的数据结构。

正确执行此操作,您将需要使用stack。您需要提取(,),[和]的所有实例(可能使用正则表达式...提示)并遍历生成的数组:

说你的文件是这样的:

(this [is] foobar)

你的正则表达式将产生这个数组:

['(', '[', ']', ')'] 

您将pop(0)从此阵列中移除到堆栈中。

<强>从算法

1)将所有标签{(,),[,]}放在一个数组中。

2)对于数组中的每个元素,从中弹出(0)并将其推入堆栈。在它之前测试它。如果它在它之前关闭了元素,那么从数组中弹出()两次(例如,如果你有'('在堆栈上,并且下一个要被推入堆栈的元素是')',')'关闭' (',所以你把它们都弹出来。)如果没有,继续。

3)如果你的数组是空的,当你的数组结束时你的堆栈是空的,那么你的文件就会很好。如果不是,那么你的文件格式很差{类似于(foo [bar]]}。

加分:正则表达式:REGEX = re.compile(r“\)\(\ [\ _ \”“),REGEX.findall(要搜索的字符串)。在Python here中查看有关正则表达式的更多信息。

答案 6 :(得分:0)

所有这些答案都是错误的,并不适用于所有情况,所以要么使用python解析器,例如tokenize等或只是使用这个

count = min(text.count(“(”),text.count(“)”))