fnmatch — 유닉스 파일 이름 패턴 매칭

fnmatch — 유닉스 파일 이름 패턴 매칭

이 모듈은 유닉스 셸 스타일 와일드카드를 지원합니다. 이것은 re 모듈에 문서화된 정규 표현식과 다릅니다. 셸 스타일 와일드카드에 사용되는 특수 문자는 다음과 같습니다:

패턴 의미
* 모든 것과 일치
? 임의의 단일 문자와 일치
[seq] seq의 임의 문자와 일치
[!seq] seq에 없는 임의 문자와 일치

출처: Python documentation

본문

리터럴 일치를 위해 메타 문자를 괄호로 감쌉니다. 예를 들어 '[?]'는 문자 '?'와 일치합니다.

파일 이름 구분자(유닉스에서는 '/')는 이 모듈에 특별하지 않습니다. 경로 이름 확장은 glob 모듈을 참조하세요(globfilter()를 사용해 경로 이름 세그먼트를 일치시킵니다). 마찬가지로 마침표로 시작하는 파일 이름도 이 모듈에 특별하지 않으며 *? 패턴으로 일치됩니다.

별도로 명시되지 않으면 "파일 이름 문자열"과 "패턴 문자열"은 str 또는 ISO-8859-1로 인코딩된 bytes 객체를 가리킵니다. 아래 문서화된 함수는 bytes 패턴과 str 파일 이름을 섞을 수 없으며 그 반대도 마찬가지입니다.

마지막으로, fnmatch(), fnmatchcase(), filter(), filterfalse() 함수에서 컴파일된 (typed) 정규식 패턴을 캐시하는 데 maxsize 32768의 @functools.lru_cache가 사용됩니다.

함수

  • fnmatch.fnmatch(name, pat) — 파일 이름 문자열 name이 패턴 문자열 pat과 일치하는지 테스트하여 True 또는 False를 반환합니다. 두 매개변수는 os.path.normcase()로 대소문자가 정규화됩니다. fnmatchcase()는 운영 체제의 표준 여부와 무관하게 대소문자 구분 비교를 수행합니다.

다음 예는 현재 디렉터리에서 .txt 확장자를 가진 모든 파일 이름을 출력합니다:

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print(file)
  • fnmatch.fnmatchcase(name, pat)namepat과 일치하는지 테스트하며, 비교는 대소문자를 구분하고 os.path.normcase()를 적용하지 않습니다.
  • fnmatch.filter(names, pat) — 파일 이름 문자열의 이터러블 names 중 패턴 pat과 일치하는 요소로 리스트를 만듭니다. [n for n in names if fnmatch(n, pat)]와 같지만 더 효율적으로 구현됩니다.
  • fnmatch.filterfalse(names, pat) — 패턴 pat과 일치하지 않는 요소로 리스트를 만듭니다. [n for n in names if not fnmatch(n, pat)]와 같지만 더 효율적입니다 (3.14에서 추가).
  • fnmatch.translate(pat) — 셸 스타일 패턴 patre.match()에 사용할 정규 표현식으로 변환해 반환합니다. 패턴은 str이어야 합니다.

예:

>>> import fnmatch, re
>>> regex = fnmatch.translate('*.txt')
>>> regex
'(?s:.*\\.txt)\\z'
>>> reobj = re.compile(regex)
>>> reobj.match('foobar.txt')
<re.Match object; span=(0, 10), match='foobar.txt'>

더 알아보기 (Learn more)