2013-06-27 9 views
0

문자열 분석 라이브러리에 익숙하지 않습니다. 과에서 가고 싶습니다 이에문자열의 일부를 사전으로 구문 분석 하시겠습니까?

'foo=5 z v xz er bar=" hel o" c z a == "hi" b = "who"' 

사전 분석 :

{'foo':5, 'bar': ' hel o', 'a': 'hi', b: 'who'} 

을하지만 시작하는 곳 모르겠습니다. 이 전환을 처리하기위한 조언을 좀 주시겠습니까?

+0

에게 그래서'v','xz','하지 er' 등 일 등호가 바닥에 떨어졌을까요? 또한 파이썬에서 시작하는 곳은 아마도 [shlex] (http://docs.python.org/2/library/shlex.html) 일 것입니다. – zwol

+0

'='또는'=='이없는 것은 모두 사전에 있어서는 안됩니다. (나는 그들을 분리 된 단계에서 다루고있다) –

답변

2

정규 표현식을 사용할 수 있습니다. python's documentation on regex 또는 tutorial's point tutorial을 참조하십시오. 이 같은

뭔가 작업 할 수 있습니다

import re 

regex = re.compile(r"(\w+ ?=+ ?\d+|\w+ ?=+ ?\"(?: *\w*)*\")") 

#your example string: 
s = 'foo=5 z v xz er bar=" hel o" c z a == "hi" b = "who"' 

matches = regex.findall(s) 

dict1 = {} 
for m in matches: 
    elems = m.split("=") 
    #elems[0] = key 
    #elems[len(elems)-1] = value, to account for the case of multiple ='s 

    try: 
     #see if the element is a number 
     dict1[str(elems[0])] = int(elems[len(elems) - 1]) 

    except: 
     #if type casting didn't work, just store it as a string 
     dict1[str(elems[0])] = elems[len(elems) - 1] 

여기에 분류 정규 표현식이다 :

(\w+ ?=+ ?\d+|\w+ ?=+ ?\"(?: *\w*)*\") 

\w+ 하나 개 이상의 알파벳 문자를 의미합니다.

\d+은 하나 이상의 숫자를 의미합니다.

(?:regex)*은 그룹 #을 지정하지 않고 정규식을 0 개 이상 복사하는 것을 의미합니다.

(regex1|regex2)은 regex1과 일치하거나 regex2와 일치하는 문자열을 찾습니다.

\"은 따옴표의 이스케이프 시퀀스입니다.

=+이 일치 하나 또는 그 이상의 "="표시를 의미

_?은 경기를 0 또는 1 공간을 의미합니다 (척은 "_"공간이다)

0

대한 파싱은 당신이 만들 수있는 구문 분석 라이브러리는 한 번에 조금씩 일치하는 식. 여기

from pyparsing import Word, alphas, alphanums, nums, oneOf, quotedString, removeQuotes 

identifier = Word(alphas, alphanums) 
integer = Word(nums).setParseAction(lambda t: int(t[0])) 
value = integer | quotedString.setParseAction(removeQuotes) 

# equals could be '==' or '=' 
# (suppress it so it does not get included in the resulting tokens) 
EQ = oneOf("= ==").suppress() 

# define the expression for an assignment 
assign = identifier + EQ + value 

# search sample string for matching assignments 
s = 'foo=5 z v xz er bar=" hel o" c z a == "hi" b = "who"' 
assignments = assign.searchString(s) 
dd = {} 
for k,v in assignments: 
    dd[k] = v 

# or more simply 
#dd = dict(assignments.asList()) 

print dd 

주는이 파서 적용하는 코드입니다 :

{'a': 'hi', 'b': 'who', 'foo': 5, 'bar': ' hel o'}