python如何检查打开和关闭标记
我有一个类似XML的文件,但它不是XML或HTML 文件示例:python如何检查打开和关闭标记,python,xml,xml-parsing,tags,Python,Xml,Xml Parsing,Tags,我有一个类似XML的文件,但它不是XML或HTML 文件示例: <config-file> name myconfig date 3-2-2016 </config-file> <client> <"ABC - CDE & 123"> </"ABC - CDE & 123"> </client> 名称myconfig 日期:2016年3月2日 我们经常编辑这个文件,把打开
<config-file>
name myconfig
date 3-2-2016
</config-file>
<client>
<"ABC - CDE & 123">
</"ABC - CDE & 123">
</client>
名称myconfig
日期:2016年3月2日
我们经常编辑这个文件,把打开或关闭的过程搞糟。未关闭或甚至未找到位置“”。
试图找到一种解析文件的好方法,以确保文件已打开和关闭。
我在想:
1-循环通过每一行,如果以
<+任何字符>
,并确保它有一个结束符
如果没有,则抛出模式错误
欢迎提供任何帮助。您已经掌握了基本知识。您只关心三种情况:
- 开始标记:提取标记(去掉尖括号)。将其推到列表的前面
- 结束标记:提取标记(去掉尖括号和前导斜杠)。检查此标记是否与列表的前面相同。如果是的话,把它打开。如果没有,则发出错误消息。如果列表中没有任何内容,则有人试图在没有打开标签的情况下关闭标签;发布消息
- EOF:当输入用完时,检查列表。任何剩余的字符串都是未关闭的标记。发布消息
stack = []
with open("parse_test_1.txt", 'r') as parse_file:
for line in parse_file:
print "INPUT LINE:", line
ltag = line.find('<')
if ltag > -1:
rtag = line.find('>')
if rtag > -1:
# Found left and right brackets: grab tag
tag = line[ltag+1: rtag]
open_tag = tag[0] != '/'
if open_tag:
# Add tag to stack
stack.append(tag)
print "TRACE open", stack
else:
tag = tag[1:]
if len(stack) == 0:
print "No blocks are open; tried to close", tag
else:
if stack[-1] == tag:
# Close the block
stack.pop()
print "TRACE close", tag, stack
else:
print "Tried to close", tag, "but most recent open block is", stack[0]
if tag in stack:
stack.remove(tag)
print "Prior block closed; continuing"
if len(stack):
print "Blocks still open at EOF:", stack
stack=[]
打开(“parse_test_1.txt”,“r”)作为parse_文件:
对于parse_文件中的行:
打印“输入行:”,第行
ltag=行。查找(“”)
如果rtag>-1:
#找到左括号和右括号:抓取标签
标签=行[ltag+1:rtag]
打开标签=标签[0]!='/'
如果打开标签:
#向堆栈添加标记
stack.append(标记)
打印“跟踪打开”,堆栈
其他:
标签=标签[1:]
如果len(stack)==0:
打印“没有打开的块;尝试关闭”,标记
其他:
如果堆栈[-1]==标记:
#关闭街区
stack.pop()
打印“跟踪关闭”、标记、堆栈
其他:
打印“试图关闭”,标记“但最近打开的块是”,堆栈[0]
如果堆栈中有标记:
堆栈。删除(标记)
打印“上一块已关闭;继续”
如果len(堆栈):
打印“EOF处仍打开的块:”,堆栈
呃,听起来很乱。您是否可以修改使用此文件的任何工具,以便它可以使用真正的XML或JSON?这是我们可以使用任何验证程序的最初目标,但由于许多其他模块都依赖于此,因此无法更改此目标。这是不幸的。祝你好运非常感谢你的帮助。这是很棒的东西。