2016-11-18 4 views
4

내가 제대로 다음과 같은 문자열을 구문 분석하는 방법에 대한 질문이 무시 괄호파이썬 대한 파싱 : 캡처 쉼표로 구분 된 목록 내부, 다음 목록에</p> <pre><code>"(test.function, arr(3,12), "combine,into one")" </code></pre> <p>, 내부 괄호

['test.function', 'arr(3,12)', '"combine,into one"'] 

참고 : 원래 문자열의 '목록'항목은 반드시 쉼표와 공백으로 구분하지 않아도됩니다. 예를 들어, 쉼표로 직접 분리 된 두 항목 일 수도 있습니다. test.function,arr(3,12).

  1. 괄호에 포함 된 입력 문자열 있지만 내부 괄호를 구문 분석 :

    는 기본적으로, 내가 원하는. (따라서 nestedExpr()은 그대로 사용할 수 없습니다.)

  2. 내부 항목은 쉼표로 구분되지만 항목 자체에는 쉼표가 포함될 수 있습니다.

또한 scanString()이 아닌 parseString() 만 사용할 수 있습니다.

저는 SO에서 일부 검색을 수행했는데 thisthis을 찾았습니다. 그러나 문제를 해결할 수는 없습니다.

감사합니다.

답변

1

이것은 당신의 중첩 및 인용 문제를 해결해야합니다

sample = """(test.function, arr(3,12),"combine,into one")""" 

from pyparsing import (Suppress, removeQuotes, quotedString, originalTextFor, 
    OneOrMore, Word, printables, nestedExpr, delimitedList) 

# punctuation and basic elements 
LPAR,RPAR = map(Suppress, "()") 
quotedString.addParseAction(removeQuotes) 

# what are the possible values inside the()'s? 
# - quoted string - anything is allowed inside quotes, match these first 
# - any printable, not containing ',', '(', or ')', with optional nested()'s 
# (use originalTextFor helper to extract the original text from the input 
# string) 
value = (quotedString 
     | originalTextFor(OneOrMore(Word(printables, excludeChars="(),") 
            | nestedExpr()))) 

# define an overall expression, with surrounding()'s 
expr = LPAR + delimitedList(value) + RPAR 

# test against the sample 
print(expr.parseString(sample).asList()) 

지문 :

['test.function', 'arr(3,12)', 'combine,into one'] 
+0

안녕하세요 Paul,이 솔루션을 공유해 주셔서 감사합니다. 이 하나는 내 질문을 해결합니다. 나는 originalTextFor()와 nestedExpr()을 알고 있지만 그런 식으로 둘 다 구현하지는 않을 것이다. –

0

터미널 괄호 사이의 모든 문자는 쉼표 + 공백으로 구분하십시오.

a = """(test.function, arr(3,12), "combine,into one")""" 
a[1:-1].split(", ") 
# ['test.function', 'arr(3,12)', '"combine,into one"'] 

참고 : 다음과 같은 공백이없는 문자열에는 쉼표 분리에 대한 다른 접근 방법과 세부 정보가 필요합니다.

['test.function','arr(3,12)','"combine,into one"'] 
+2

일반적으로, 하나는 모든 쉼표 구분 기호가 공백 될 것이라고 가정 할 수 없다. – PaulMcG

+0

참. 보다 구체적인 대답 (예를 들어 정규 표현식을 사용하는 답변)의 경우 특정 구분 기호에 대한 세부 정보를 제공해야합니다. 이 응답은 이러한 세부 사항이 없으면 제시된 질문을 다룹니다. – pylang

+0

안녕하세요, 자세한 내용을 제공하지 않아서 죄송합니다. @PaulMcGuire가 정확합니다. 괄호 안의 '목록'은 반드시 쉼표와 공백으로 구분되지 않습니다. 나는 명확성을 위해 나의 질문을 편집 할 것이다. –