문제 상황
문자열의 시작 부분이나 끝 부분에 특정 텍스트 패턴이 있는지 확인해야 하는 경우가 자주 있습니다. 대표적인 예로 파일 확장자 검사가 있지만, 실제로는 어떤 패턴이든 응용할 수 있습니다. 이 글에서는 Python으로 문자열의 앞뒤를 손쉽게 검사하는 다양한 방법을 소개합니다.
startswith() 메서드로 문자열 시작 확인하기
문자열이 특정 텍스트로 시작하는지 확인하는 가장 간단한 방법은 startswith() 메서드를 사용하는 것입니다. 이 메서드는 조건이 일치하면 True, 그렇지 않으면 False를 반환합니다.
기본 예제
text = "Is USA colder than Australia?"
print(f"output \n {text.startswith('Is')}")
출력 결과:
True
파일명 검사 예제
filename = "Hello_world.txt"
print(f"output \n {filename.startswith('Hello')}")
출력 결과:
True
URL 프로토콜 검사 예제
site_url = 'https://www.something.com'
print(f"output \n {site_url.startswith('http:')}")
출력 결과:
False
'https://'는 'http:'로 정확히 시작하지 않으므로 False가 반환됩니다. 반면 아래처럼 'https:'로 검사하면 True가 나옵니다.
print(f"output \n {site_url.startswith('https:')}")출력 결과:
True
endswith() 메서드로 문자열 끝 확인하기
반대로 문자열이 특정 텍스트로 끝나는지 확인할 때는 endswith() 메서드를 사용합니다.
기본 예제
text = "Is USA colder than Australia?"
print(f"output \n {text.endswith('?')}")
출력 결과:
True
파일 확장자 검사 예제
filename = "Hello_world.txt"
print(f"output \n {filename.endswith('.txt')}")
출력 결과:
True
여러 개의 패턴을 한 번에 검사하기: 튜플 활용
위 메서드들은 여러 선택지를 동시에 검사해야 할 때 튜플(tuple) 형태로 인자를 전달받습니다. 가장 흔한 활용 사례는 디렉터리 내에서 특정 확장자의 파일을 찾는 작업입니다. 예를 들어 '.csv'와 '.txt' 파일을 검증한다고 가정해 보겠습니다.
import os
filenames = os.listdir('.')
먼저 해당 확장자를 가진 파일이 하나라도 존재하는지 확인해 보겠습니다.
# 파일 존재 여부 확인
print(f"output \n {any(name.endswith(('.csv', '.txt')) for name in filenames)}")
출력 결과:
True
리스트 컴프리헨션을 사용하면 조건에 맞는 파일명 목록을 직접 추출할 수도 있습니다.
[name for name in filenames if name.endswith(('.csv', '.txt'))]출력 결과:
['file1.csv',
'HRDataset.csv',
'Input.csv',
'input.txt',
'input_copy.txt',
'movies_data.csv',
'my_html_data_to_csv.csv',
'temporary_file1_for_zip.csv',
'temporary_file2_for_zip.csv',
'test.csv',
'test1.txt',
'test2.txt',
'tmdb_5000_movies.csv']
주의사항: 리스트가 아닌 튜플을 전달해야 합니다
startswith()와 endswith()는 문자열 또는 문자열 튜플만 인자로 받습니다. 만약 검색할 패턴이 리스트 형태라면 반드시 튜플로 변환해야 하며, 그렇지 않으면 오류가 발생합니다.
import os
# 리스트 형태의 패턴
patters = ['.csv', '.txt']
# 파일명 가져오기
filenames = os.listdir('.')
# 파일 존재 여부 확인
any(name.endswith(patters) for name in filenames)
출력 결과:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in
8
9 # Let us first check if there are files
---> 10 any(name.endswith(patters) for name in filenames)
TypeError: endswith first arg must be str or a tuple of str, not list
위와 같이 TypeError가 발생합니다. 해결 방법은 간단합니다. tuple() 함수를 사용해 리스트를 튜플로 변환하면 됩니다.
올바른 예제
# 파일 존재 여부 확인
any(name.endswith(tuple(patters)) for name in filenames)
출력 결과:
True
마찬가지로 파일명 목록을 추출할 때도 리스트를 튜플로 변환해야 합니다.
[name for name in filenames if name.endswith(tuple(patters))]
출력 결과:
['file1.csv',
'HRDataset.csv',
'Input.csv',
'input.txt',
'input_copy.txt',
'movies_data.csv',
'my_html_data_to_csv.csv',
'temporary_file1_for_zip.csv',
'temporary_file2_for_zip.csv',
'test.csv',
'test1.txt',
'test2.txt',
'tmdb_5000_movies.csv']
다른 연산과 결합하여 활용하기
startswith()와 endswith() 메서드는 데이터 필터링, 집계 같은 일반적인 데이터 처리 연산과 함께 사용할 때 특히 강력합니다. 예를 들어 조건에 맞는 파일이 존재할 때 특정 로직을 실행하는 코드는 다음과 같이 작성할 수 있습니다.
if any(name.endswith(tuple(patters)) for name in filenames):
# 여기에 원하는 로직을 수행합니다
마무리
지금까지 살펴본 내용을 정리하면 다음과 같습니다.
- startswith(): 문자열이 특정 텍스트로 시작하는지 확인
- endswith(): 문자열이 특정 텍스트로 끝나는지 확인
- 여러 패턴을 검사할 때는 반드시 튜플로 전달 (리스트는
tuple()로 변환) any(), 리스트 컴프리헨션 등과 결합하면 파일 검증, 데이터 필터링에 매우 유용
정규표현식(regex)보다 가볍고 직관적이어서, 단순한 접두사·접미사 검사에는 이 두 메서드가 최고의 선택입니다.