2012-03-29 2 views
3

문자열의 패턴을 바꾸는 동안
특히 이름이 일치하는 그룹의 정수/긴 값이 필요합니다.Regex는 Python에서 대체합니다. 이름이 지정된 그룹을 정수로 변환합니다.

가지 경우 예 내가 뭘하려 :

status = {1:'foo', 23:'bar'} 
re.sub(
    '<status>(?P<id>\d+)', 
    status.get(int(r'\g<id>')), # ValueError: invalid literal for int() with base 10: '\\g<id>' 
    # status.get(int(r'\g<id>'.decode())), # ValueError: invalid literal for int() with base 10: '\\g<id>' 
    # status.get('%d' % r'\g<id>'), # %d format: a number is required, not str 
    'Tom ran: from <status>1 to <status>23') 

일반 주조 원시 문자열 int(r'22')하지만 위 작동하지 않습니다 잘 작동?

+0

어떤 방식으로 작동하지 않습니까? 완전하고 정확한 예를 보여주십시오. http://sscce.org/ – Marcin

+0

나는 위의 질문에서 시도한 모든 시도에서 제기 된 오류를 추가했습니다. 감사. – Pratyush

+2

문제는 정규식 대체에 마법이 없다는 것입니다. r '\ g '과 같은 것은 문자 그대로 백 슬래시, 'g'및 두 개의 꺾쇠 괄호를 포함하는 일반 문자열입니다. re.sub() 메서드 안에는 이러한 문자열을 구문 분석하는 코드가 있습니다. 문자열을 re.sub()에 도달하기 전에 int()와 같은 다른 문자열에 전달하려고하면 int()는 백 슬래시와 g 및 꺾쇠 괄호로 리터럴 문자열을보고 no 아이디어를 만들어야합니다. 그래서 thg435가 보여 주듯이 람다 형식을 사용해야합니다. –

답변

7

이 당신을 위해 작동합니다 : REPL 함수입니다

re.sub(
    '<status>(?P<id>\d+)', 
    lambda m: status.get(int(m.group('id'))), 
    'Tom ran: from <status>1 to <status>23') 

경우, 패턴의 모든 겹치지 발생에 대해 호출됩니다. 이 함수는 단일 일치 객체 인수를 사용하고 대체 문자열을 반환합니다. @http://docs.python.org/library/re.html#re.sub

+0

고마워요, 그건 매력처럼 작동합니다. – Pratyush

관련 문제