2017-01-19 1 views
0

: -특정 파일 접미사를 제외하는 정규식을 작성하려면 어떻게합니까? 내가 여기에 주어진 튜토리얼 찾고 있어요

https://docs.python.org/2/howto/regex.html#lookahead-assertions

내가 .pqr.gz로 끝나는 파일을 제외 할 내가 그렇게하는 방법을 아주 확실하지 않다.

예를 들어, 예상되는 동작은 다음과 같습니다 -

f1.gz => succeed 
f1.abc.pqr => succeed 
f1.pqr.gz => fail 
f1.abc.gz => succeed 

내가 가지고 올 수있는 가장 좋은 정규식했다 : -

r'.*[.](?=[^.]*[.][^.]*)(?!pqr[.]gz$)[^.]*[.][^.]*$' 

이 .pqr.gz하지만 아무튼로 끝나는 파일을 제외 ' 예를 들어 f1.gz 인 파일을 허용합니다 (즉 위에서 쓴 첫번째 경우).

개선 방법에 대한 의견이 있으십니까?

EDIT : -이를 수행하는 더 좋은 방법이 있습니다 (예 : string.endswith 사용).하지만 정규식을 사용하여이 작업을 수행하는 방법에 대해 궁금합니다.

+4

접미사. –

+2

'. * (?

+0

@ Rawing That works. 당신은 대답으로 대답을 쓸 수 있습니까? (희망적으로 설명과 함께) 나는 그것을 받아 들일 것입니다. – owagh

답변

0

글쎄, TBH, 당신의 정규 표현식은 나에게 잔인한 것처럼 보입니다. 당신은 간단하게 할 수있다 :

if not '.pqr.gz' in line: 
    print(line) 

그리고 완료.

for line in lines: 
    file, result = line.split(' => ') 
    if file.endswith('.pqr.gz'): 
     print("Skipping file {}".format(file), file=sys.stderr) 
     continue 
    print(file) 
    # and you could do something if result == "success" there after! 
당신이 regexps '에 함께 일을 주장으로

는 :

여기에 현재의

사실, "간단한"문자열 조작과 같은 몇 가지 간단한 작업에서 많은 작업을 수행 할 수 있습니다 정규식 표현

Regular expression visualization

그리고 여기입니다 @rawing 제안에서 영감 같은 솔루션 :

.*(?<!\.pqr\.gz) => 

Regular expression visualization

+1

적어도'str.endswith'를 사용하십시오 .. – L3viathan

+0

나는 실용적인 목적보다는 정규 표현식을 사용하는 것이 정신 운동에 더 가깝다고 언급해야한다고 생각한다. – owagh

+0

gz 또는 pqr이 아닌 확장을 필터링하고 싶습니까? –

-1

한 가지 파이썬의 re 모듈과주의해야 할이 re.match가 암시 적으로 문자열의 시작에 정박 것입니다.

문자 그대로의 마침표는 문자 클래스에 넣는 것보다 읽기 쉽고 (잠재적으로 더 빠를 수 있음) 이스케이프 처리하여 일치시킬 수 있습니다 (\.). 다음 정규식 트릭해야 re.match를 들어

: 대신 re.search를 사용하는 경우

r'.*\.pqr\.gz$' 

는 정규식에 단축 할 수 그냥이 :

r'\.pqr\.gz$' 
당신은 확인하기 위해 정규 표현식에 사용하지 말아야
+0

re.match에서 알아 두어야 할 또 다른 사항은 문자열 끝에 자신 만의 앵커를 제공해야한다는 것입니다. '\ Z'와'$'두 가지 선택 사항이 있습니다 ...'$'는 perl의 숙취로 존재합니다. '\ Z'를 사용하십시오. –

+0

다시'\ Z'는 후행 개행을 명시 적으로 match 문으로 고려하려는 경우에만 바람직합니다. '$'는 perl에서 숙취가 아니라 유용한 다른 앵커입니다. 예를 들어, 문자열의 끝이 아닌 줄 끝과 일치시키려는 경우, 특히'flags = re.MULTILINE'을 사용할 때 특히'\ Z'는 잘못된 선택입니다. – KingRadical

+0

다시 OP의 질문을 보면 ... "foo"가 아닌 "foo"로 끝나는 문자열이 필요합니다. –

관련 문제