<p>通常,当人们开始用python编写代码时,他们会试图通过使用字符串操作或正则表达式之类的简单方法来解决这些典型的解析问题。。。这两种方法在解决简单问题时都很好,但对于更复杂的问题,有更好的选择。你知道吗</p>
<p>例如,对于这个特定的问题,没有真正的理由不尝试许多现有可用的<a href="https://nedbatchelder.com/text/python-parsers.html" rel="nofollow noreferrer">python parsing tools</a>中的一个。为了证明这一点,让我们看看如何使用<a href="https://github.com/lark-parser/lark" rel="nofollow noreferrer">lark</a>库来解决这个问题。你知道吗</p>
<p>安装pip后<code>lark-parser</code>请尝试以下代码段:</p>
<pre><code>import sys
import textwrap
from lark import Lark
if __name__ == "__main__":
content = textwrap.dedent(r"""
<THING1> \
var1 = 0 \#
var2 = "0.0 100.0 0.0" \#
var3 = "IDENTIFYING_WORD" \#
# something similar
var4 = 2 \#
</THING1>
<THING2> \
# something similar
var1 = 0 \#
</THING2>
""")
grammar = r"""
?start: block*
block: tag_start line* tag_end
tag_start: "<" NAME ">" "\\"
tag_end: "</" NAME ">"
line: assignment
| comment
assignment: lhs "=" rhs "\#"
comment: "#" NAME* NEWLINE
lhs: NAME
rhs: ESCAPED_STRING
| NAME
| NUMBER
%import common.NEWLINE
%import common.ESCAPED_STRING
%import common.CNAME -> NAME
%import common.NUMBER
%import common.WS
%ignore WS
"""
parser = Lark(grammar)
tree = parser.parse(content)
for block in tree.find_data("block"):
tag_name = list(block.find_data("tag_start"))[0].children[0]
print(tag_name.center(80, '-'))
for assignment in block.find_data("assignment"):
var_name = assignment.children[0].children[0]
value = assignment.children[1].children[0]
print(var_name, "=>", value)
</code></pre>
<p>你应该得到这样的结果:</p>
<pre><code> -THING1 -
var1 => 0
var2 => "0.0 100.0 0.0"
var3 => "IDENTIFYING_WORD"
var4 => 2
-THING2 -
var1 => 0
</code></pre>
<p>上面的示例并不打算成为一个涵盖所有细节的完整示例,而只是一个小示例,说明用现代解析库解决这些简单问题有多容易。我将把它作为一个简单的练习留给您,让您调整代码并使用lark来满足您的需要。你知道吗</p>