2010-07-06 1 views
2

파싱 된 목록을 추출하여 원본 문자열을 반환 할 수 있습니까?pyparsing을 사용하여 목록을 "파싱"

+1

아마도 "이전"과 "후"의 예를 포함하도록 질문을 편집 할 수 있습니까? – PaulMcG

+0

이것은 관련 토론 스레드 (http://pyparsing.wikispaces.com/message/view/home/19406599)로, pyparsing을위한 "양방향"기능에 대해 논의 할 수 있습니다. – PaulMcG

답변

6

예, 인 경우 입력을 버리지 않도록 지시했습니다. 당신은 Combine 연결자와 함께합니다.

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

는 "deparse"하려면 :

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

제공 여기

>>> 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'], {}) 

이 재구성 된 문자열이 이해하기, 그래도 "는 deparsing은"단계는 충분한 정보를 가지고 있지 않습니다

>>> reconstitutedList = Combine(myList, adjacent=False) 
>>> reconstitutedList.parseString(s) 
(['abcdefghi'], {}) 
+0

나는이 막연한 질문에 대해 당신이 정말로 이것을 취하여 도망 갔다. 그것을 사랑해! – jathanism

+1

훌륭한 답변과 pyparsing 주제에 대한 고맙습니다! 또한 당신이 묘사하는 것과 유사한 기능을 위해 최근에 추가 된'originalTextFor' 헬퍼 메소드를 확인해보십시오. 그러나 이것은 개입하는 공백을 보존 할 수 있습니다. – PaulMcG

+0

멋진 팁, Paul! 나는 그런 것들을 찾고 있었지만 찾지 못했습니다. 1) pyparsing 페이지의 API 문서 링크가 깨졌고, 2) 내가 찾은 UCSC 온라인 문서가 아마도 날짜가 있기 때문입니다. 바라건대 우리는 하나 또는 다른 업데이 트를 얻을 수 있습니다! 최신 소스 + doc을 살펴 보겠습니다. –