【问题标题】:python how to check for open and close tagspython如何检查打开和关闭标签
【发布时间】:2016-03-03 00:52:13
【问题描述】:

我有一个类似 XML 的文件,但它不是 XML 或 HTML。

文件示例:

<config-file>
   name myconfig
   date 3-2-2016
</config-file>
  <client>
   <"ABC - CDE & 123">
   </"ABC - CDE & 123">
  </client>

我们经常编辑这个文件并弄乱打开或关闭。要么不关闭,甚至错过地方“”。 试图找到一种解析文件的好方法,以确保它已打开和关闭。 我在想:

1-循环遍历每一行并记录它是否以 &lt; + any characters &gt; 并确保它有一个关闭 &lt;/ + any characters&gt;,如果没有,则会引发模式错误。

欢迎任何帮助。

【问题讨论】:

  • 呃,听起来很乱。您是否可以修改使用此文件的任何工具,以便它可以使用真正的 XML 或 JSON?
  • 这是我们可以使用任何验证器的初始目标,但由于许多其他模块都依赖于它,因此无法更改。
  • 这很不幸。祝你好运!

标签: python xml xml-parsing tags


【解决方案1】:

你有基础。你只关心三种情况:

  1. 开始标签
  2. 结束标签
  3. 其他所有内容(忽略)

使用正则表达式查找开始和结束标签;确保 begin 表达式排除斜杠作为第二个字符。现在,做一个简单的堆栈:一个字符串列表就可以了。此列表将包含打开的标签。

动作:

  • 开始标签:提取标签(去掉尖括号)。将其推到列表的前面。
  • 结束标签:提取标签(去掉尖括号和前导斜杠)。检查此标记是否与列表的前面相同。如果是这样,弹出它。如果不是,则发出错误消息。如果列表中没有任何内容,则有人试图在没有打开的标签时关闭标签;发消息。
  • 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

【讨论】:

  • 非常感谢您的帮助。这是很棒的东西。
猜你喜欢
  • 2019-05-16
  • 2019-06-18
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多