2013-08-19 4 views
0

은 :파이썬으로 일치 : 파이썬에서

  1. 할당은 조건문에서 허용되지 않습니다.
  2. 정규 표현식 일치의 상태는 다른 일치 정보가 포함 된 반환 된 일치 객체를 기반으로 결정됩니다. 다음과 같이

    m = pat1.match(buffer) 
    if m:  
        tok = tok1 
        val = m.group(0) 
    else: 
        m = pat2.match(buffer) 
        if m: 
         tok = tok2 
         val = m.group(0) 
        else: 
         m = pat3.match(buffer) 
         if m: 
          tok = tok3 
          val = m.group(0) 
          # extra processing here and there - makes looping unsuitable 
         else: 
          m = pat4.match(buffer) 
          if m: 
           tok = tok4 
           val = m.group(0) 
          else:  
           # ... keep indenting 
    

    우리는 정말 뭔가를하고 싶은 :

이제 우리는 10 또는 15에서 특정 패턴과 일치하고 싶은 말은, 우리는 다음과 같이 어수선하게 뭔가 결국

if match ... pat1: 
    tok = 
    val = 
elif match ... pat2: 
    tok = 
    val = 
elif match ... pat3: 
    tok = 
    val = 
... 

(조건부 할당, 표준 일치 개체의 부작용, 참조 함수에 의한 다른 형식의 일치 함수 등)를 사용하는 다른 언어에서도 가능합니다.

패턴을 실행하기 위해 루프를 사용할 수도 있지만 일치하는 항목마다 처리 방법이 다를 경우 이 적합하지 않습니다.

그래서 : 일치하는 조건을 동일한 수준으로 유지하는 멋진 비단뱀 같은 방법이 있습니까?! 쌍으로 토큰과 패턴을 통해

답변

4

루프, 다음과 같은 조정할 수 있도록 :

for pat, token in zip([pat1, pat2, pat3], ['tok1', 'tok2', 'tok3']): 
    m = pat.match(buffer) 
    if m: 
     val = m.group(0) 
     tok = token1 
     break 
아이디어는 당신이 패턴의 손 전에 테이블을 구축입니다

-> 값 :

tests = [ 
    (re.compile('([a-z]{2})'), 'func1'), 
    (re.compile('(a{5}'), 'token2') 
] 

for pattern, token in tests: 
    m = pattern.match(buffer) 
    if m: 
     # whatever 

을 이것은 컴파일 된 객체와 버퍼를 인수로 취할 수있는 호출 가능 (callable)을 제공하도록 확장 될 수 있으며, 원하는 모든 것을 수행하고 값을 반환합니다.

예 :

def func1(match, buf): 
    print 'entered function' 
    return int(buf) * 50 

tests = [ 
    (re.compile('\d+'), func1) 
] 

for pattern, func in tests: 
    m = pattern.match(buffer) 
    if m: 
     result = func(m, buffer) 
+0

루프 바람직하지 않다 - 각 지점에 대한 처리의 변화가있을 수있다 - PLS 문제를 확인한다. –

+0

@BaselShishani 당신이 얻을 수있는 가장 가까운 것은 디스패치 모델을 사용하는 것입니다 ... 업데이트 된 답변보기 - 물론 테스트의 두 항목 모두 호출 가능하고 다시 컴파일 된 객체가 될 수 없습니다 –

+0

방법으로 초고속 답변을 주셔서 감사합니다 . –

관련 문제