2013-10-03 2 views
1

저는 파이썬 초보자입니다. 그러므로 정규 표현식 기술은 레벨 -122입니다.대체를 사용하여 정규 표현식을 사용하여 숫자 변환

file1을 포함한 문자열을 file01으로 변환해야하지만 file10file010으로 변환 할 필요가 없습니다.

내 프로그램이 잘못이지만,이 내가 얻을 수있는 가장 가까운, 나는 조합의 수십 시도했지만 내가 가까이 갈 수 없습니다

import re 
txt = 'file8, file9, file10' 
pat = r"[0-9]" 
regexp = re.compile(pat) 
print(regexp.sub(r"0\d", txt)) 

누군가가 내 패턴에 문제가 있는지 말해 줄 수 및 대체하고 나에게 몇 가지 제안을 해?

답변

1

당신은 수를 캡처하고 0을 추가하기 전에 길이를 확인,하지만 당신은 대신 사용할 수 있습니다 수 :

import re 
txt = 'file8, file9, file10' 
pat = r"(?<!\d)(\d)(?=,|$)" 
regexp = re.compile(pat) 
print(regexp.sub(r"0\1", txt)) 

regex101 demo

(?<! ...)

부정적인 lookbehind라고합니다. 이렇게하면 네거티브 lookbehind 패턴이 일치하는 패턴 다음에 패턴이 일치하면 (부정) 방지됩니다. 예를 들어 (?<!a)b은 문자열 앞에 ( bb, cb)과 일치하지만 ab과 일치하지 않는 경우를 제외하고는 문자열에 모두 b과 일치합니다. (?<!\d)(\d)은 따라서 앞에 다른 숫자가없는 한 한자리 숫자와 일치합니다.

(\d)은 캡처 그룹으로 묶인 단일 숫자이며 간단한 괄호로 표시됩니다. 캡처 된 그룹은 첫 번째 캡처 그룹에 저장됩니다.

(?= ...)은 긍정적 인 미리보기입니다. 긍정적 인 미리보기 내의 패턴이이 긍정적 인 미리보기 앞의 패턴과 일치하면 과 일치합니다. 즉, a(?=b)은 그 후에 b이있는 경우에만 a 문자열에 모두 일치합니다. ab이 일치하지만 ac 또는 aa은 일치하지 않습니다.

(?=,|$)은 쉼표 또는 문자열의 끝을 의미하는 ,|$을 포함하는 긍정적 인 미리보기입니다.

(?<!\d)(\d)(?=,|$)은 앞에 숫자가없고 그 뒤에 쉼표가 있거나 해당 숫자가 문자열 끝에있는 경우 모든 숫자와 일치합니다.

+1

젠장, 난 똑같은 코드를 작성,하지만 당신이 나를 이길 : P –

+0

를 @ GamesBrainiac 죄송합니다, 죄송합니다 ^^; – Jerry

+0

좋아요, 물어볼 게 있는데, 모든 상징 뒤에있는 논리를 설명 할 수 있습니까? 나는 \ d가 숫자이고 | 대안이지만 나머지는 - 특히 그 순서대로 나를 혼란스럽게합니까? 나는 내 자신에 대해서 그렇게 생각하지 않을 것이라고 생각한다. – pythonintraining

0

어때요?

a='file1'  
a='file' + "%02d" % int(a.split('file')[1]) 
+0

죄송합니다.이 과제에 대해 대체 정규 표현식을 사용해야하지만 훨씬 쉽습니다! – pythonintraining

0

이 방법은 제로와 패드에 모든 숫자의 순서와 str.zfill 찾기 위해 정규식을 사용

>>> txt = 'file8, file9, file10' 
>>> re.sub(r'\d+', lambda m : m.group().zfill(2), txt) 
'file08, file09, file10' 
관련 문제