2

解析されたリストをpyparsingに与えて、元の文字列を返すようにすることは可能ですか?

4

1 に答える 1

7

はい、パーサーに入力を破棄しないように指示した場合は可能です。Combineコンビネータでそれを行います。

あなたの入力が次のとおりだとしましょう:

>>> s = 'abc,def,  ghi'

リストの正確なテキストを取得するパーサーを次に示します。

>>> from pyparsing import *
>>> myList = Word(alphas) + ZeroOrMore(',' + Optional(White()) + Word(alphas))
>>> myList.leaveWhitespace()
>>> myList.parseString(s)
(['abc', ',', 'def', ',', '  ', 'ghi'], {})

「デパース」するには:

>>> reconstitutedList = Combine(myList)
>>> reconstitutedList.parseString(s)
(['abc,def,  ghi'], {})

これにより、最初の入力が返されます。

しかし、これには代償が伴います。余分な空白をすべてトークンとして使用するのは、通常は便利ではありませmyList。空白を取り除くバージョンは次のとおりです。

>>> myList = Word(alphas) + ZeroOrMore(',' + Word(alphas))
>>> myList.parseString(s)
(['abc', ',', 'def', ',', 'ghi'], {})
>>> reconstitutedList = Combine(myList, adjacent=False)
>>> reconstitutedList.parseString(s)
(['abc,def,ghi'], {})

この時点ではリテラル入力が返されていないことに注意してください。ただし、これで十分な場合があります。また、Combine に空白のスキップを許可するように明示的に指示する必要があることにも注意してください。

しかし実際には、多くの場合、区切り文字を気にすることさえありません。パーサーがアイテム自体に集中するようにします。commaSeparatedList区切り文字と空白の両方を便利に削除するという関数があります。

>>> myList = commaSeparatedList
>>> myList.parseString(s)
(['abc', 'def', 'ghi'], {})

ただし、この場合、「逆解析」ステップには、再構成された文字列が意味を成すのに十分な情報がありません。

>>> reconstitutedList = Combine(myList, adjacent=False)
>>> reconstitutedList.parseString(s)
(['abcdefghi'], {})
于 2010-07-08T04:42:17.663 に答える