2013-06-30 2 views
2

양식이 이고 pyparsing이 적절한 토큰을 반환하지만 실제 텍스트를 가져 오는 데 관심이 있으며 어떻게 찾을 수 없습니까?pyparsing 토큰에서 원본 텍스트를 얻는 방법

함수를 사용하여 setParseAction을 시도했지만 문자열과 위치 만 반환하기 때문에 후행 부분을 처리 할 수 ​​없습니다. 처럼, 난 단지 얻을 것이다 :

"sum(value2,value3)), "sumname")" 
"sum(value1,sum(value2,value3)), "sumname")" 
"name(sum(value1,sum(value2,value3)), "sumname")" 

을 그리고이 적합하지 않습니다, 나는 실제 원래 문자열을 얻기 위해 수동으로 문자열을 재분석하고 싶지 않아요.

내가 기압을 시도하고 방법은 다음과 같습니다

tokens = grammar.parseString(target_string) 
print >>sys.stderr, pyparsing.originalTextFor(tokens) 

을하지만이 정말하지 않는 일 :

AttributeError: 'NoneType' object has no attribute 'setParseAction' 

답변

3

는 대한 파싱 도우미 originalTextFor에 표현을 바꿈.

from pyparsing import makeHTMLTags, originalTextFor 

sample = '<tag attr1="A1" attr2="B3">' 

openTag = makeHTMLTags('tag')[0] 

# the expression returned by makeHTMLTags parses the tag and 
# attributes into a list (along with a series of helpful 
# results names) 
print (openTag.parseString(sample).asList()) 

# prints 
# ['tag', ['attr1', 'A1'], ['attr2', 'B3'], False] 

# wrap in 'originalTextFor' to get back the original source text 
print (originalTextFor(openTag).parseString(sample).asList()) 

# prints 
# ['<tag attr1="A1" attr2="B3">'] 
+0

안녕을 나를 위해 실패한다'tokens = grammar.parseString (target_string)' 'print >> sys.stderr, pyparsing.originalTextFor (tokens)'나는 그것이 의심 스럽다 parseStrin g는 ParseResults를 반환하고 ParseElements는 반환하지 않습니다. –

+0

'originalTextFor'는 결과가 아닌 문법을 래핑합니다. 'originalTextFor (문법) .parseString (토큰)'을 시도하십시오. – PaulMcG

+0

나는 그것을 본다. 그러나 아직, 당신은 항상 원래의 문자열을 제공하고 있고, 가지고있는 것은 모두 parseString의 결과이고, 나는 문자열을 다시 필요로한다. 당신은 문자열을 parseString에 넘겨주고, 이해가되지만, 토큰이없는 문자열 만 있습니다. –

0

원래 일치하는 텍스트를 얻어서 달성 하려는지에 따라 scanString 또는 transformString를 사용하여 더 나은 해결책을 찾을 수 있습니다

from pyparsing import makeHTMLTags, replaceWith 

sample = '<other><div></div><tag attr1="A1" attr2="B3"><something>' 
openTag = makeHTMLTags('tag')[0] 

# grammar.scanString is a generator, yielding tokens,start,end tuples 
# from the start:end values you can slice the original text from the 
# source string 
for tokens,start,end in openTag.scanString(sample): 
    print tokens.dump() 
    print sample[start:end] 

# if your goal in getting the original data is to do some kind of string 
# replacement, use transformString - here we convert all <TAG> tags to <REPLACE> tags 
print openTag.setParseAction(replaceWith("<REPLACE>")).transformString(sample) 

인쇄 :

['tag', ['attr1', 'A1'], ['attr2', 'B3'], False] 
- attr1: A1 
- attr2: B3 
- empty: False 
- startTag: ['tag', ['attr1', 'A1'], ['attr2', 'B3'], False] 
    - attr1: A1 
    - attr2: B3 
    - empty: False 
    - tag: tag 
- tag: tag 
<tag attr1="A1" attr2="B3"> 
<other><div></div><REPLACE><something> 
관련 문제