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

これは、中括弧を除くすべて、または別のセクションとして、セクション内に何が許可されるかを定義します。次に、各中括弧は、対応する右中括弧と一致します。中かっこが一致しない場合、 apyparsing.ParseExceptionが発生します。

通常、トークンはすべてトークンのリストとして返され、それぞれが '{'、'}' または一連のその他の中括弧以外の文字に一致します。角かっこで囲まれたすべての式を覚えておきたいので、ここで parseAction はそれらを外部リストに追加します。それを処理するためのよりクリーンな方法はわかりませんが、これにより、必要に応じallSectionsてグループを含むリストが作成されます。

于 2013-09-20T19:05:59.753 に答える