我想通过它修复一个函数我可以计算使用了多少次:(,),[,] 如果计数(等于) 如果[的数量等于]的数量 那么我的语法有效!
我的第一次 - 失败 - 尝试:
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)
答案 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)
我相信,你正在寻找平衡的符号检查器。最好使用堆栈。
制作一个空堆栈,
对于字符串中的每个符号:
2.1如果符号是开头符号,请将其推入堆栈。
2.2如果是结束符号,那么
2.2.1如果堆栈为空,则为false。
2.2.2如果堆栈顶部与结束符号不匹配,则返回false。 [如果要检查匹配的大括号,请选中此步骤]
2.2.3弹出堆栈。
如果堆栈为空,则返回true,否则返回false。
第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(“)”))