임의로 중첩 된 대괄호 집합 내의 모든 텍스트와 일치하는 파서를 작성하기 위해 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']]
간단한 목록 이해로 이들을 제거 할 수는 있지만 두 번째 중복 수준을 없애면 이상적입니다.
parseAction을 추가하여 내부 텍스트 (일부 사용자 지정 텍스트 서식 지정 수행 중)에서 발생하는 상황을 바꿀 때 오류가 발생했습니다. 내가 알아 내려고하는 더 큰 질문은 중첩 된 목록에서 단일 결과를 중지하는 방법입니다. 목록을 사용하지 않고 comprehenson을 사용하지 않아도됩니다. (구문 분석 된 텍스트가 거대하고 피할 수 없기 때문에 for 루프). –
그룹화 하시겠습니까? – PaulMcG