2013-03-15 4 views
1

'Alex 28'이라는 문자열이 있습니다. 이제 28을 추출하고 regex를 사용하여 2를 더하고 싶습니다.re.sub에서 교체 부품을 평가하는 방법?

펄에서, 나는이처럼 가지고 수 :

#!/usr/bin/perl 
use strict; 
use warnings; 

my $str='Alex 28'; 
$str=~s/(\d+)/$1+2/e; 

파이썬에서이를 달성하기 위해, 나는 다음 시도 :

#!/usr/bin/python 

import re 

str = 'Alex 28' 

match=re.sub(r'(\d+)',r'\g<1>',str) 

가 어떻게이 '\g<1>'에 2를 추가하려면 가져온거야? int 함수를 사용해 보았는데 작동하지 않습니다. 도와주세요.

버전 : 파이썬 2.7.3

답변

4

당신은 re.subsupplying a function to the repl argument로 사용할 수 있습니다이 :

REPL 함수 인 경우는 패턴의 모든 비 중복 발생에 대해 호출됩니다. 이 함수는 단일 일치 객체 인수를 사용하고 대체 문자열을 반환합니다. 변수 이름으로 str을 사용

  • 이 나쁜 선택과 같습니다

    re.sub(r'(\d+)', lambda m: str(int(m.group()) + 2), s) 
    

    있다는 점 유의 하시길 바랍니다 : 람다를 사용하여

    def add_two(match): 
        return str(int(match.group()) + 2) 
    
    s = 'Alex 28' 
    re.sub(r'(\d+)', add_two, s) 
    

    을 또는 :

예를 들어

기본 제공을 무시합니다. str

  • 치환은 문자열과 독점적으로 작동하므로 인수로 전달 된 함수는 문자열을 반환해야합니다.
  • 전체 일치를 반환하는 match.group()을 사용했습니다. 정규 표현식에서 여러 그룹을 정의하는 경우 그룹 인덱스를 지정해야 할 수 있습니다.
  • +0

    일치하는 패턴에 대한 평가를 원할 때마다 항상 perl처럼 사용자 정의 함수 나 람다 함수를 통해서만 수행 할 수 있습니까? – Guru

    +0

    저는 그렇습니다. 파이썬의 정규 표현식은 라이브러리이며 언어의 일부가 아닙니다 (Perl에 있다고 믿기 때문에). – icecrime

    +0

    두 개의 서로 다른 성냥 그룹이 있다면? –

    관련 문제