파이썬 문자열 find·index·in, 포함 여부와 첫 위치 찾기

이 카테고리 글 목록

전체글 보기

문자열이 들어 있는지만 확인하려면 in을, 첫 위치도 필요하면 find()를 쓰세요. find()는 맨 앞에서 찾으면 0, 못 찾으면 -1을 돌려줍니다.

가상의 로그 두 줄에서 WARN의 포함 여부를 출력하고, 찾은 줄에서는 그 위치부터 표시를 잘라 봅니다.

marker = "WARN"

for log in ("WARN cache | WARN disk", "INFO ready"):
    print("포함", marker in log)
    position = log.find(marker)
    if position == -1:
        print("위치 없음")
    else:
        print("첫 위치", position, log[position:position + len(marker)])
포함 True
첫 위치 0 WARN
포함 False
위치 없음

if에 find 결과를 바로 넣으면 왜 거꾸로 판단할까?

if log.find(marker):는 반환된 정수를 참·거짓으로 평가합니다. 첫 위치인 0은 거짓이고, 누락을 뜻하는 -1은 참입니다. 위치가 필요하면 위 코드처럼 -1을 직접 비교하세요. 포함 여부만 쓰는 분기에는 if marker in log:면 충분합니다.

in은 이어진 부분 문자열을 찾습니다. 검색어를 입력받는 화면에서 빈 검색어를 막으려면 따로 확인하세요. 빈 문자열 ""은 모든 문자열에 포함된 것으로 처리됩니다.

index는 찾지 못한 경우를 예외로 알립니다

찾는 표시가 반드시 있어야 하는 입력이라면 index()로 누락을 오류로 처리할 수 있습니다. find()와 index() 모두 시작과 끝을 지정할 수 있고, 반환 위치는 원래 문자열 기준입니다.

log = "WARN cache | WARN disk"

print(log.find("WARN", 4, 13))
print(log.index("WARN", 4))

try:
    log.index("ERROR")
except ValueError as error:
    print(type(error).__name__)
-1
13
ValueError

두 번째 WARN은 인덱스 13에서 시작합니다. 첫 호출은 4부터 13 직전까지만 검색하므로 두 표시를 모두 놓칩니다. 끝을 생략한 두 번째 호출은 그 표시의 위치를 돌려줍니다. 마지막 호출은 ERROR가 없어 ValueError를 발생시킵니다.

두 예제는 Windows의 CPython 3.14.3에서 실행했습니다. Python의 str.find 문서, str.index 문서, 포함 검사 문서에 반환값과 검색 범위가 나옵니다.

리스트에서 일치하는 모든 위치가 필요하다면 enumerate로 리스트의 일치 인덱스 모으기 예제를 참고하세요.

이 카테고리의 다른 글

전체글 보기

댓글 남기기