2014-02-17 2 views
2

저는 파이썬의 새로운 모듈을 처음 접했지만 파일의 버전 번호를 얻기 위해 정규 표현식을 작성하려고했습니다. 대부분의 경우이 조각은 작동하는 것 같다 :정규 표현식을 이해하는 데 어려움이있는 경우, 파이썬

test = "filename.ver3_576.exr" 
print(re.search("(?!(v|ver|version|vers))\d+", test.lower()).group()) 

을하지만 조금 테스트 문자열을 변경하는 경우, 그것은 나에게 내가 기대하는 결과를 제공하지 않습니다 : 나는 분명히 뭔가 잘못하고있는 중이 야

test2 = "filename.ver_3_576.exr" # expects None, because of the underscore, gets 3 
test3 = "filenameVe2_version201_1001.exr" # expects 201, gets2, "ve"(exactly) is not something I want to search for 

을 여기에 있지만 그게 무엇인지 파악하는 데 어려움이 있습니다. 귀하의 코멘트에 대답하기 위해

어떤 도움도 대단히 감사하겠습니다, 환호

+1

'(?! ...)'는 '...'이 다음과 일치하지 않는다는 것에주의하십시오. 귀하의 경우've'는'... '과 일치하지 않으므로'2'가 매치됩니다. – Bakuriu

+0

멋지다 ... 그렇다면 여전히 뒤를 사용하고 싶다면 어떤 표현을 권하고 싶습니까? 건배 – iGwok

+1

'?!'는 ** 보이지 않는 **입니다. '? <='와'? Bakuriu

답변

2
re.search('(version|vers|ver|v)(\d+)', test.lower()).group(2) 

, 당신은 lookbehind 표현을 사용하지 않았다. 이것은 선견지명이 부정적인 표현입니다. 사용하신 표현은 '\d+'과 동일합니다 (이유를 설명하기가 쉽지 않음).

고정 폭 패턴이 필요하기 때문에이 경우 긍정적 인 검색 표시를 사용하는 것은 쉽지 않습니다. 예를 들어, 다음은 오류를 던질 것입니다 : '(?<=(version|vers|ver|v))\d+', 그래서 내가 가장 오래 전진 할 때 bucause를 게시 한 것을 사용하는 것이 좋습니다.

+0

감사합니다. 이것이 효과가 있습니다 ... 내 표현에 잘못되어있는 것은 무엇 이었습니까? 나는 뒤에서보기가 괜찮을 것이라고 생각했을 것이다. – iGwok

관련 문제