使用文件匹配括号

时间:2019-06-26 08:01:32

标签: python

我正在尝试从文件中的一行匹配括号,但是当我使用下面的代码而不从文件中获取数据并输入它时,它可以工作并匹配括号。我也不知道如何在数字和字母之间使用它。

我尝试了许多不同的方法,但到目前为止效果最好。我认为首先是我所打印的内容有问题,但是我已经尽力解决了所有已知问题。我也是python的新手,所以它可能不是最好的代码。

class Stack:
    def __init__(self):
        self._items = []

    def isEmpty(self):
        return self._items == []

    def push(self,item):
        self._items.append(item)

    def pop(self):
        return self._items.pop()

stack = Stack()

open_list = ["[","{","("] 
close_list = ["]","}",")"] 

def open_file():
    file = open("testing.txt","r")
    testline = file.readline()
    count = 1
    while testline != "":
        testline = testline[:-1]
        check(testline,count)
        testline = file.readline()
        count = count + 1


def check(testline,count): 
    stack = [] 
    for i in testline:
        if i in open_list: 
            stack.append(i) 
        elif i in close_list: 
            pos = close_list.index(i) 
            if ((len(stack) > 0) and
                (open_list[pos] == stack[len(stack)-1])): 
                stack.pop() 
            else: 
                print ("Unbalanced")
                print (count)
    if len(stack) == 0: 
        print ("Balanced")
        print (count)


def main():
    open_file()

if __name__=="__main__": 
    main()

输出:

如果文件包含

dsf(hkhk [khh])

ea {jhkjh [}}

hksh [{(]

sd {hkh {hkhk [hkh]}}]

输出为

Balanced
1
Unbalanced
2
Unbalanced
2
Unbalanced
3
Unbalanced
4
Balanced
4

前四个是正确的,但它加了2,我不知道它从哪里来。我在打印时需要计数,以便以后使用(即第1行是平衡的)

2 个答案:

答案 0 :(得分:0)

您的open_file()函数存在一些问题。

  1. 仅当testline == ""返回true时,while循环才会结束。因此,以后再做check(testline)时,实际上是给该函数一个空字符串,因此它实际上无法完成工作。

  2. 我假设while循环的目的是为文件中的每一行删除换行符\n吗?问题是您没有在任何地方保存中间线。然后,当file.readline()由于文件中没有更多行而返回""时,您将该空字符串提供给函数。

一些建议

# A way to remove newlines
testline = testline.replace("\n", "")

# Check all the lines
lines = file.readlines()
count = len(lines)

for testline in lines:
    testline = testline.replace("\n", "")
    check(testline)

# And if you're sure that the file will have only one line
testline = file.readline()[:1] # read line and remove '\n'
check(testline)

请记住,字符串只是一个充满字符的列表。因此,您可以执行len(string)来查看长度。或者,您可以执行len(file.readlines())以查看文件有多少行。无论哪种方式,您都可以摆脱count变量。

打印

当您调用print(check())时,它首先会调用没有参数的check()函数,因此它实际上无法检查任何内容。这就是为什么您看不到正确的打印语句的原因。 建议的编辑方法是将打印语句移至open_file()函数的末尾,以便您拥有print(check(testline))

另一种可能的解决方案是在您的open_file()函数中放入return语句。

def open_file():
    # Some code...
    return check(testline)

def check():
    # Some code...

print(open_file())

最简单的方法可能是将return中的check()语句替换为print语句。

答案 1 :(得分:0)

是时候学习调试基础了...

@emilanov为open_file函数提供了提示,因此我将重点介绍check函数。

for i in range (0,len(testline),1):

可能不是您想要的:i将从0len(testline) -1取整数。规则是:如果出现问题,请使用调试器或添加跟踪打印。在这里

for i in range (0,len(testline),1): 
    print(i)        # trace - comment out for production code

将使问题显而易见。

您想要的可能是:

for i in testline: