1

我想解析 LaTeX 文件中可能嵌套的组:像这样:

import pyparsing as pp
qs = pp.QuotedString(quoteChar='{', endQuoteChar='}')
s = r'''{ This is a \textbf{\texttt{example}} of \textit{some $\mb{y}$ text} to parse.}'''
print qs.parseString(s)

但这不可能是正确的(它停在第一个右括号上)。输出是:

([' This is a \\textbf{\\texttt{example'], {})

我怎样才能得到一个可以迭代的结果,我正在考虑这样的回报,如果我想要的只是组:

{ This is a \textbf{\texttt{example}} of \textit{some $\mb{y}$ text} to parse.}
{\texttt{example}}
{example}
{some $\mb{y}$ text}
{y}

用例是测试 LaTeX 源文件的常见标记错误。

4

1 回答 1

2

这里的关键是您嵌套了括号以正确匹配它们的右括号。您编写的语法确实会停在第一个右括号,而不是匹配的右括号。解决方案是定义一个语法,以便将新的左括号匹配为另一个部分。

import pyparsing as pp

allSections = []
def rememberSection(m):
    allSections.append(''.join(m))
other = pp.Word(pp.printables.replace('{','').replace('}','') + ' \t\r\n')
section = pp.Forward()
section << ('{' + pp.OneOrMore(other | section) + '}').setParseAction(rememberSection)

s = r'''{ This is a \textbf{\texttt{example}} of \textit{some $\mb{y}$ text} to parse.}'''
print section.parseString(s)
print allSections

这将允许在一个部分内的内容定义为除大括号或其他部分之外的所有内容。然后每个大括号与相应的右大括号匹配。如果大括号不匹配,pyparsing.ParseException将引发 a。

通常,所有标记都将作为标记列表返回,每个标记都匹配“{”、“}”或一系列其他非大括号字符。由于我们希望记住每个带括号的表达式,因此此处的 parseAction 将它们添加到外部列表中。我不确定有什么更简洁的方法来处理它,但这将构建allSections包含您想要的组的列表。

于 2013-09-20T19:05:59.753 回答