2016-10-05 6 views
3

임의로 중첩 된 대괄호 집합 내의 모든 텍스트와 일치하는 파서를 작성하기 위해 pyparsing을 사용하려고합니다. 우리는이 같은 문자열을 고려하는 경우 : 파서는 방법으로 일치하는 것이 두 경기를 반환Pyparsing - 중첩 된 대괄호의 가장 바깥 쪽 집합에 일치

"[A,[B,C],[D,E,F],G] Random Middle text [H,I,J]" 

내가하고 싶은 것은 :

[ 
    "[A,[B,C],[D,E,F],G]", 
    "[H,I,J]" 
] 

나는 다소-작업을 수행 할 수 있었다 버전의 originalTextFor를 사용하여 nestedExpr으로 메쉬 처리했으나 중첩이 OriginalTextFor 표현식의 수보다 더 깊을 때 중단됩니다.

nestedExpr에 잡힌 가장 바깥 쪽 표현식 만 일치시키는 간단한 방법이나 논리를 수정하여 첫 번째 일치하는 일치 항목 이후의 모든 항목을 구문 분석하지 않고 일반 텍스트로 처리 할 수 ​​있습니까? 여분의 수준이 거기에 있지만,

def mynest(opener='{', closer='}'): 
    content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS)) 
    ret = Forward() 
    ret <<= (Suppress(opener) + originalTextFor(ZeroOrMore(ret | content)) + Suppress(closer)) 
    return ret 

이것은 대부분의 방법이 저를 가져옵니다

업데이트 : 가까운 내가 달성하고 싶은에 온 것 한 가지는 nestedExpr에서 논리의 수정 된 버전입니다 거기에리스트 래핑 (wrapping)이 필요하다. 정말로 내가 원하는 것은 그 괄호가 문자열에 포함되는 것이다 (억압하지 않으면 무한 재귀 상황에 빠지지 않는다).

parser = mynest("[","]") 
result = parser.searchString("[A,[B,C],[D,E,F],G] Random Middle text [H,I,J]") 
result.asList() 
>>> [['A,[B,C],[D,E,F],G'], ['H,I,J']] 

간단한 목록 이해로 이들을 제거 할 수는 있지만 두 번째 중복 수준을 없애면 이상적입니다.

답변

2

이 작동하지 않을 이유는 확실하지 :

sample = "[A,[B,C],[D,E,F],G] Random Middle text [H,I,J]" 

scanner = originalTextFor(nestedExpr('[',']')) 

for match in scanner.searchString(sample): 
    print(match[0]) 

인쇄 :

'[A,[B,C],[D,E,F],G]' 
'[H,I,J]' 

"당신의 중첩이 OriginalTextFor 식의 수보다 더 깊은 경우이 나누기"상황이 무엇

?

+0

parseAction을 추가하여 내부 텍스트 (일부 사용자 지정 텍스트 서식 지정 수행 중)에서 발생하는 상황을 바꿀 때 오류가 발생했습니다. 내가 알아 내려고하는 더 큰 질문은 중첩 된 목록에서 단일 결과를 중지하는 방법입니다. 목록을 사용하지 않고 comprehenson을 사용하지 않아도됩니다. (구문 분석 된 텍스트가 거대하고 피할 수 없기 때문에 for 루프). –

+0

그룹화 하시겠습니까? – PaulMcG

관련 문제