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"- 키워드를 시도 pyparsing

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

필드로 해석되어야한다 작동하지 않습니다. 샘플 문자열이 들어 나는 ParseException를 얻을 :이 말이

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

때문에 choice하지 마지막 발생의 발생에 stopOn 중지됩니다. 어떻게 대신 마지막 발생에 멈추는 문법을 작성할 수 있습니까? 어쩌면 context-sensitive grammar에 갈 필요가 있을까요?

+0

문제 대한 파싱, 당신은이 같은 도우미 메서드를 작성할 수 : "pp.Or (pp.Keyword ("ONE "), pp.Keyword ("OTHER "))'- 키워드 ("OTHER ")는"ANOTHER "의"OTHER "와 일치하지 않으며, 또는 표현식이 아니라 2 개의 표현식. – PaulMcG

+0

물론 그렇습니다! 그냥 샘플을 생성했을 때 미끄러졌습니다. 문제가 해결되었습니다. 감사. – halloleo

답변

1

때로는 "파서가 되십시오"시도해야합니다. 다른 X'es와 구별되는 "X의 마지막 발생"에 대해서는 무엇입니까? 이것을 말하는 한 가지 방법은 "더 이상 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

그리고 한 가지 질문 : 왜 SkipTo를 호출합니까? - FollowedBy (expr)도 함께 작동합니다. 성능? – halloleo