2012-06-15 2 views
1

구문 분석 할 줄이 수백 개 있습니다. $global 파이썬의 특정 DICT를 나타냅니다파이썬에서 정규식을 사용하여 특정 문자 사이의 모든 부분 문자열을 추출하는 방법은 무엇입니까?

key1 = $global.path 
key2 = prefix +$global.name 
key3 = prefix + $default 
key4 = prefix+$lib.id + $value + $args.id + ' some between ' + $global.title 

'settings' 전화 :처럼 그들은이다. 모든 조건 '$ global.key'를 dict 값 settings['key']으로 바꾸고 싶습니다. $lib$args$global과 유사합니다. 단지 $default하지 않고있는 경우 '.'

, $global.default

으로 동일해야합니다 그리고 모든 '+', ' + ', '+ ', ' +' 직접 제거해야합니다.

어떻게 이것을 파이썬에서 할 수 있습니까? 나는 평범한 파이썬으로 그것을 할 수있다. 하지만 정규식을 사용하는 것이 더 좋습니다. 모두 대소 문자를 구분해야합니다.

먼저 어떤 사전을 찾을 지 인식합니다. 열쇠 가져와. 그런 다음 사전에 값을 가져옵니다. 마지막으로 자리 표시자를 값으로 바꿉니다.

예를 들어, settings['name']은 'carl'입니다. 그런 다음 라인 :

key2 = prefixcarl 

감사 :

key2 = prefix + $global.name 

로 변경해야합니다. 어떤 도움을 주신 것입니다 :)

==================== =====================

편집 :

내가 손에 가지고 무엇

: 글로벌 $에 대한 1. 사전, $ lib 디렉토리, $ args 2. 수백 줄.

원하는 항목 : 자리 표시 자와 동일한 줄 수 $some.some이 사전의 해당 값으로 변경되었습니다. 그리고 '+'는 '연결'으로 표현됩니다.

+0

@Tomalak, 덕분에 당신은 그들에 대한 액세스를 얻기 위해 closure을 사용해야합니다. 업데이트 된 게시물을 확인하십시오. – Joy

+0

보유한 내용과 원하는 내용을 다시 게시하여 소식을 업데이트했습니다. 어떻게 든 당신은 당신의 코드를 게시하는 것을 잊어 버렸습니다. * 당신이 이것을 해결하는데 얼마나 많은 노력을했는지 보여줍니다. – Tomalak

+0

@Tomalak. 어, 아무것도 아직 끝나지 않았습니다 ... – Joy

답변

6

기능 "대체"매개 변수를 사용 re.sub :

settings = {} 
settings['name'] = 'carl' 

key2 = "foo $global.name bar" 

import re 
print re.sub(r'\$(\w+)\.(\w+)', lambda m: settings[m.group(2)], key2) 
다음

If repl is a function, it is called for every non-overlapping occurrence of pattern. The function takes a single match object argument, and returns the replacement string.

이야 여러 dicts (가 전역으로 정의되어 가정)와 '기본'인수를 지원하는 버전 :

re.sub(r'\$(\w+)(\.(\w+))?', lambda m: globals()[m.group(1)][m.group(3) or 'default'], key2) 

사전에 함수가 정의되어있는 경우 더 이상 globals()에 속하지 않지만 오히려 그 기능의 locals().

import re 

def some_func(): 
    settings = {'result_dir':'dir'} 
    args = {'run_id':'id'} 

    vars = locals() 

    print re.sub(r'\$(\w+)(\.(\w+))?', lambda m: vars[m.group(1)][m.group(3)], '$settings.result_dir + $args.run_id') 

some_func() 

그리고 dicts 클래스에있는 경우 마지막으로, 당신이 그들에 액세스 할 수 getattr(self)를 사용할 수 있습니다 :

class X(object): 

    def __init__(self): 
     self.settings = {'result_dir':'dir'} 
     self.args = {'run_id':'id'} 

    def some_method(self): 
     print re.sub(r'\$(\w+)(\.(\w+))?', lambda m: getattr(self, m.group(1))[m.group(3)], '$settings.result_dir + $args.run_id') 


X().some_method() 
+0

감사합니다. 하지만 그것은 하나의 사전 '설정'만 사용하여 여러 개의 딕테이션을 지원할 수있게 만드는 방법은 무엇입니까? – Joy

+1

@Cai : 업데이트 – georg

+0

안녕하세요, 나는 이것을 실행합니다 : 'settings = { 'result_dir': 'dir'} args = { 'run_id': 'id'} 인쇄 re.sub (r '\ $ (3)], '$ settings.result_dir + $ args.run_id')'\\ w (\ w +)) 콘솔에서 실행했는데 정확합니다. 하지만 python 파일에서 실행하면 "KeyError : 'settings'"가 표시됩니다. 문제가 무엇입니까? – Joy

관련 문제