0

を発生することは、これらのお気に入り:問題は、しかし、その部分 キーワードが起こる式の文法と最後の時間を一致させるためにどのように私は、文字列にマッチする式の文法を書きたい

words at the start ONE|ANOTHER wordAtTheEnd ---------^-------- ----^----- --^-- A: alphas B: choice C: alphas 

ある

を含めることができます Bのキーワード "ONE"または "ANOTHER"のいずれかであるため、 の最後のの選択キーワードの出現は、 Bと一致する必要があります。ここでは例:

choice = pp.Or([pp.Keyword("ONE"), pp.Keyword("OTHER")])('B') 
start = pp.OneOrMore(pp.Word(pp.alphas), stopOn=choice)('A') 
end = pp.Word(pp.alphas)('C') 
expr = (start + choice) + end 

しかし、この:文字列

ZERO ONE or TWO are numbers ANOTHER letsendhere 

は私がOneorMore表現するための "stopOn" -keywordを試してみましたpyparsing

A: "ZERO ONE or TWO are numbers" 
B: "ANOTHER" 
C: "letsendhere" 

フィールドに解析する必要があります動作しません。サンプル文字列のために私はParseExceptionを得る:stopOnchoice最初発生しませ最後発生時に停止するため

Expected end of text (at char 12), (line:1, col:13) 
"ZERO ONE or >!<TWO are numbers ANOTHER text" 

これは、理にかなっています。代わりに、最後に発生した文法をどうやって書くことができますか?多分私はcontext-sensitive grammarに頼る必要がありますか?

+0

問題pyparsingを使用すると、このようなヘルパーメソッドを書くことができ: "pp.Or(pp.Keyword(" ONE ")、pp.Keyword(" OTHER "))' - キーワード( "OTHER")は "ANOTHER"の "OTHER"と一致しません。式ではなく、2式である。 – PaulMcG

+0

はい、もちろんです!私はサンプルを生成したばかりです。質問で修正されました。ありがとう。 – halloleo

答えて

1

「パーサになる」ようにしなければならないことがあります。それを他のX'esと区別する "Xの最後の出現"についてはどうですか?これを言う1つの方法は、 "それ以上のXが続かないX"です。ここで

def last_occurrence_of(expr): 
    return expr + ~FollowedBy(SkipTo(expr)) 

それはOneOrMoreにSTOPON引数として使用されている:

integer = Word(nums) 
word = Word(alphas) 
list_of_words_and_ints = OneOrMore(integer | word, stopOn=last_occurrence_of(integer)) + integer 

print(list_of_words_and_ints.parseString("sldkfj 123 sdlkjff 123 lklj lkj 2344 234 lkj lkjj")) 

プリント:あなたの文法と

['sldkfj', '123', 'sdlkjff', '123', 'lklj', 'lkj', '2344', '234'] 
+0

'OneOrMoreの' Word'や 'Keyword'式で動作します(あるいは、期待通りの...(...)部分、正確には.Cool。 – halloleo

+0

' CaselessKeyword'式に問題がありました: 'ParsingException'が生成されました。 - 私はこれを "弱い" Keyword(..、caseless = true)を代わりに使って解決しました。 – halloleo

+0

そして1つの質問:なぜSkipToを呼びますか? - FollowedBy(expr)だけで動作します。パフォーマンス? – halloleo

関連する問題