2012-09-30 3 views
2

예기치 않은 대한 파싱 동작 :디버그 대한 파싱 코드를하는 동안 나는이 예기치 않은 동작이 가로 질러

string1 = "this is a test string : that behaves as I expect\n" 
string2 = "this string does not behave as I expect\n" 

field = CharsNotIn(":\n") 
line = field + ZeroOrMore(Literal(":") + field) + LineEnd() 

print line.parseString(string1) 
print line.parseString(string2) 

이 다음과 같은 출력이 생성 파서가 픽업 할 수있는 몇 가지 이유를 들어

['this is a test string ', ':', ' that behaves as I expect', '\n'] 
['this string does not behave as I expect'] 

을 끝 줄 문자는 string1입니다. 그러나 string2에서 가져올 수 없습니다. 심지어 라인의 끝을 집어하지 않은 경우 string2에 대한 일치를 생성 할 수있는 방법을 이해할 수 없습니다.

string1 = "this is a test string : that behaves as I expect*" 
string2 = "this string also behaves as I expect*" 

field = CharsNotIn(":*") 
line = field + ZeroOrMore(Literal(":") + field) + Literal("*") 

print line.parseString(string1) 
print line.parseString(string2) 

이 생산 :

['this is a test string ', ':', ' that behaves as I expect', '*'] 
['this string also behaves as I expect', '*'] 

답변

1

인쇄 라인은 의사를보고 라인의 끝이 잘 작동하는 것 같다보다

이 문제는 다른 문자를 사용하는 등 라인 문자의 끝 특히 보인다 일치하는 거지. 나는이 권리를 이해한다면

>>> print line 
{!W:(: 
) [{":" !W:(: 
)}]... LineEnd} 

, 그것은 (귀하의 예를 들어 문자열 2 년, 전체 라인을 소요하는) 첫 줄 바꿈에서 정지 비 콜론 이외의 개행 문자을 찾고 후, 콜론 및 더 많은 단어를 찾습니다 존재한다면 (존재하지 않는다면), 그 다음에 개행을합니다. 내 생각 엔 개행 인스턴스가 어떻게 든 떨어지는 것입니다. 개행과 일치하지 않으면 문자열과 일치하지 않는다는 주장이 거짓입니다.

>>> print line.parseString('xyzyy') 
['xyzyy'] 

이 그것도 줄 바꿈없이 일치 왜 질문을 떠나지 않습니다 ...