필자는 Pyparsing을 처음 접했고 (Python을 처음 접했을 때도). 나는 내 문제를 무엇이 잘못되었는지 설명 할 수있는 가장 간단한 형식으로 줄이려고 노력했다. (Pyparsing이 전혀 필요하지 않은 지점까지!)토큰을 수정하는 초보자 용 setParseAction 대체
문자와 숫자로 구성된 문자열이 있다고 가정 해 보겠습니다. 예 : "b7 z4 a2 de c3". 항상 편지가 있지만 번호는 선택 사항입니다. 이것을 개별 요소로 파싱 한 다음 처리해야하지만 번호가없는 맨손없는 문자가있는 경우 변경 후 "기본"번호 1을 갖도록 변경하는 것이 좋습니다. 그런 다음 모든 요소를 일관된 방식으로 처리 할 수있었습니다.
from pyparsing import *
teststring = "a2 b5 c9 d e z"
expected_letter = Word("ABCDEFGabcdefgzZxy", exact=1)
expected_number = Word(nums)
letter_and_number = expected_letter + expected_number
bare_letter = expected_letter
bare_letter.setParseAction(lambda s,l,t: t.append("1"))
elements = letter_and_number | bare_letter
line = OneOrMore(elements)
print line.parseString(teststring)
는 불행하게도, t.append는() 나는 "1"의 목록에 추가이었다, 기대하고있는 무슨을하지 않는 다음과 같이 나는, 나는 setparseAction이 할 수 있다고 생각 파싱 된 토큰. 대신 오류가 발생합니다. TypeError : 'str'개체를 호출 할 수 없습니다.
나는 정말로 두꺼운 사람일지도 모르지만, 전문가 중 한 명은 나를 똑바로 세워줄 수 있습니다.
감사
스티브 대한 파싱에 대해 얻을 수있는 기본 개념의
아, 이제 완벽하게 이해할 수 있습니다! 구문 분석 결과를 인쇄 할 때 일반 목록처럼 보였으므로 일반적인 방법으로 추가 할 수 있다고 생각했습니다. 또한 Optional에서 기본 설정을 허용한다는 사실을 놓쳤습니다.이 기본 설정은 더 깔끔한 전체 솔루션을 제공합니다.그리고 그것은 내 실제 프로그램에 적용될 것인데,이 프로그램은 제거 된 버전보다 조금 복잡합니다. 당신의 도움에 대한 많은 감사 .... 그리고 Pyparsing 자체! 스티브. –