Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 문자열의 시작과 끝 텍스트 매칭하기: startswith()와 endswith() 활용법

문제 상황

문자열의 시작 부분이나 끝 부분에 특정 텍스트 패턴이 있는지 확인해야 하는 경우가 자주 있습니다. 대표적인 예로 파일 확장자 검사가 있지만, 실제로는 어떤 패턴이든 응용할 수 있습니다. 이 글에서는 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)보다 가볍고 직관적이어서, 단순한 접두사·접미사 검사에는 이 두 메서드가 최고의 선택입니다.