2012-11-07 4 views
7

정규식 변수를 문자열로 채우고 싶습니다.어떻게 정규식 문자열을 매개 변수로 채우십시오.

import re 

hReg = re.compile("/robert/(?P<action>([a-zA-Z0-9]*))/$") 
hMatch = hReg.match("/robert/delete/") 
args = hMatch.groupdict() 

args 변수는 이제 { "action": "delete"}가있는 사전입니다.

어떻게이 과정을 되돌릴 수 있습니까? args dict 및 regex 패턴을 어떻게 문자열 "/ robert/delete /"얻을 수 있습니까?

다음과 같은 기능을 가질 수 있습니까?

def reverse(pattern, dictArgs): 

+0

을 추가 당신은 당신이에 관심이 있다는 연장에 문자열을 설명하는 값의 사전이 있다면 ... 왜 당신이 필요로하는 것 그 문자열을 다시 빌드하는 정규식? 당신은 이미 차이를 만드는 모든 비트를 가지고 있습니다. 이러한 비트를 사용하고 문자열을 만드는 함수를 작성하기 만하면됩니다. (즉, 이것은 불가능하지 않으므로 아마도 시간을 낭비하지 않을 것입니다.) – Tomalak

+0

이 "기능"은 Django에서 URL 문자열을 얻기 위해 사용되는 reverse()와 같은 기능을 구현하고 싶습니다. 그것은 가능한 장고 args와 그냥 "brute-force"패턴? – 0xBAADF00D

+1

파이썬의 것입니다. 장고가 아닙니다. 하지만 요점은 이것입니다. 예를 들어, "/ robe [또는] t?/(? P ((?! foo) [a-zA-Z0-9] *))"'? regex에는 서로 의존하는 선택적 및 조건부 파트가 있기 때문에 일치 목록에서 원래 문자열로 되돌릴 방법이 없습니다. 따라서 허용되는 정규식의 극히 * 좁은 하위 집합을 정의하거나 구문 분석기를 작성합니다. 아마도 일부 부작용이 없거나 심각하게 제한되어 있거나 더 생산적으로 시간을 소비하게됩니다. ;) Regex matching은 단방향 길이다. – Tomalak

답변

2

이 기능은 어떻게해야이

def reverse(regex, dict): 
    replacer_regex = re.compile(''' 
     \(\?P\<   # Match the opening 
      (.+?)  # Match the group name into group 1 
     \>\(.*?\)\)  # Match the rest 
     ''' 
     , re.VERBOSE) 

    return replacer_regex.sub(lambda m : dict[m.group(1)], regex) 

당신은 기본적으로 (\? P ...) 블록을 일치하고 딕셔너리의 값으로 교체하십시오.

EDIT : regex는 내 exmple의 정규식 문자열입니다. 당신은

regex_compiled.pattern 

EDIT2가 후두둑에서 그것을 얻을 수 있습니다 자세한 정규식

+0

이 기능은 내 프로젝트에서 잘 작동합니다. 감사합니다! – 0xBAADF00D

0

사실 주셔서 감사합니다, 나는 그것을 어떤 좁은 경우에 행할라고 생각하지만, "일반적인 경우에"꽤 복잡한 것.

일종의 유한 상태 머신을 작성하고 정규식 문자열을 구문 분석 한 후 다른 부분을 분할 한 다음이 부분에 대해 적절한 조치를 취해야합니다.

일반 기호의 경우 - "있는 그대로"기호를 결과 문자열에 입력하십시오. 명명 된 그룹의 경우 - 대신에 dictArgs의 값을 입력하십시오. 선택적 블록 - 값의 일부를 입력하십시오.

등등.

하나의 requllar 표현식은 종종 큰 (또는 심지어 무한한) 문자열 집합과 일치 할 수 있으므로이 "역순"함수는별로 유용하지 않습니다.

관련 문제