긴 안내문에서 파이썬이라는 단어를 찾으려면 사람은 눈으로 처음부터 훑어봅니다. Python에도 이와 비슷한 질문을 하는 짧은 표현이 있습니다. 바로 "파이썬" in 안내문입니다.
저도 오랜만에 파이썬을 다시 공부하면서 in을 단순히 “들어 있으면 True”라고 외우기보다, 왼쪽의 글자 조각이 오른쪽 문자열 안에 연속해서 놓여 있는지 묻는 질문으로 다시 정리해 봤습니다. 이 한 문장을 잡으면 대소문자와 공백 때문에 결과가 달라지는 이유도 자연스럽게 보입니다.

테스트 환경
- 작성 및 실행 확인일 : 2026년 8월 11일
- 운영체제 : Windows
- 로컬 실행 환경 : Python 3.9.13
- 공식 문서 확인 : Python 3.14.6 표현식과 문자열 문서
예제는 Python 3의 내장 기능만 사용합니다. 검색 전에 공백과 대소문자를 정리하는 방법이 낯설다면 파이썬 문자열 메서드 기초를 먼저 읽으면 흐름이 잘 연결됩니다.
in은 위치가 아니라 예 또는 아니요를 알려준다
카페 메뉴판에서 파이썬이라는 글자를 찾아보겠습니다.
menu = "아메리카노 카페라떼 파이썬라떼"
print("파이썬" in menu)
print("자바" in menu)
실행 결과입니다.
True
False
첫 줄은 menu 안에 파이썬이 있으므로 True, 두 번째 줄은 자바가 없으므로 False입니다. True와 False는 참과 거짓을 나타내는 불리언 값입니다.
여기서 in을 금속 탐지기처럼 생각하면 쉽습니다. 물건이 어느 좌표에 있는지까지 알려주는 지도는 아니고, 탐지 범위 안에 원하는 것이 있는지 없는지만 알려줍니다.
찾을 글자 조각 in 전체 문자열
질문 → True 또는 False
순서를 거꾸로 읽지 않도록 주의해야 합니다. "파이썬" in menu는 “파이썬 안에 메뉴가 있는가?”가 아니라 “메뉴 안에 파이썬이 있는가?”라는 질문입니다.
문자열에서는 붙어 있는 글자 조각을 찾는다
문자열에서 in은 왼쪽 문자열이 오른쪽 문자열의 부분 문자열인지 확인합니다. 부분 문자열은 원본 안에서 순서대로, 그리고 끊기지 않고 이어지는 글자 조각입니다.
text = "파이썬 라떼"
print("파이썬" in text)
print("썬 라" in text)
print("파이라떼" in text)
True
True
False
파이썬은 처음 세 글자에 그대로 있고, 썬 라도 썬, 공백, 라가 연속해서 있으므로 True입니다. 반면 파이와 라떼가 각각 보이더라도 파이라떼라는 다섯 글자가 붙어 있지는 않으므로 False입니다.
종이에 적힌 문장을 투명한 창으로 왼쪽부터 한 칸씩 비춰 본다고 상상해 보세요. 창 안의 글자가 찾는 조각과 모두 같아지는 순간이 한 번이라도 있으면 True입니다. 중간 글자를 건너뛰어 조립하지는 않습니다.
눈에는 비슷해도 대소문자와 공백은 다른 글자다
Python은 우리가 “뜻이 비슷하다”고 느끼는지를 추측하지 않습니다. 실제 문자 배열이 맞는지 비교합니다.
message = "Python Cafe"
print("Python" in message)
print("python" in message)
print("Python " in message)
print("PythonCafe" in message)
True
False
True
False
영문 대문자 P와 소문자 p는 다른 문자입니다. Python 뒤에는 실제로 공백이 있으므로 "Python "은 들어 있지만, 그 공백을 없앤 "PythonCafe"는 들어 있지 않습니다.
검색 결과가 예상과 다르면 repr()로 보이지 않는 공백을 먼저 확인하고, 영문 대소문자를 같은 모양으로 정리했는지 살펴보면 좋습니다.
빈 검색어가 항상 True인 이유
조금 뜻밖의 결과도 있습니다.
print("" in "파이썬")
print("" in "")
True
True
빈 문자열 ""은 글자가 하나도 없는 문자열입니다. Python은 빈 문자열을 모든 문자열의 부분 문자열로 봅니다. 글자 사이와 문자열의 양 끝 어디에도 “아무 글자도 없는 조각”을 놓을 수 있다고 생각하면 됩니다.
문법적으로는 올바른 결과지만 검색창에서는 빈 검색어를 입력했는데 모든 문장이 검색되는 문제가 될 수 있습니다. 실제 프로그램을 만들 때는 in을 실행하기 전에 검색어가 비어 있지 않은지 별도로 확인해야 합니다.
not in은 같은 질문의 대답을 뒤집는다
not in은 “들어 있지 않은가?”를 묻습니다.
menu = "아메리카노 카페라떼 파이썬라떼"
print("자바" not in menu)
print("파이썬" not in menu)
True
False
자바는 메뉴에 없으므로 “들어 있지 않다”가 참입니다. 파이썬은 들어 있으므로 같은 질문의 결과가 거짓입니다.
not in을 새로운 검색 방식으로 외울 필요는 없습니다. 먼저 in의 결과를 생각한 다음 그 대답을 반대로 뒤집는다고 이해하면 됩니다.
in과 find는 질문의 목적이 다르다
둘 다 글자를 찾지만 돌려주는 대답이 다릅니다.
menu = "아메리카노 파이썬라떼"
print("파이썬" in menu)
print(menu.find("파이썬"))
print(menu.find("자바"))
True
6
-1
in은 존재 여부를 True 또는 False로 알려줍니다. find()는 처음 발견한 위치를 숫자로 알려주며, 찾지 못하면 -1을 돌려줍니다. 문자열의 첫 글자 위치는 0부터 세므로 파이썬의 파는 6번 위치입니다. 0부터 세는 이유와 문자열 인덱스가 낯설다면 파이썬 문자열 기초의 우편함 번호 비유를 함께 보면 좋습니다.
있는지만 궁금하다 → "파이썬" in menu
처음 나온 위치가 필요하다 → menu.find("파이썬")
예 또는 아니요가 필요한데 굳이 find() != -1이라고 길게 쓸 필요는 없습니다. 반대로 문장을 잘라 내기 위해 시작 위치가 필요하다면 in만으로는 정보가 부족합니다. 도구 이름보다 내가 어떤 대답을 원하는지를 먼저 정하는 것이 핵심입니다.
숫자를 문자열에서 바로 찾으면 TypeError가 난다
문자열 안에 보이는 2026을 숫자 2026으로 찾으면 될 것 같지만, 둘은 자료형이 다릅니다.
coupon = "이벤트 2026"
print(2026 in coupon)
Python 3.9.13에서 직접 실행하면 다음 오류가 발생했습니다.
Traceback (most recent call last):
File "06_type_error.py", line 2, in <module>
print(2026 in coupon)
TypeError: 'in <string>' requires string as left operand, not int
오른쪽이 문자열이면 찾을 대상인 왼쪽도 문자열이어야 합니다. 화면에 같은 모양으로 보이는 것과 같은 자료형인 것은 다릅니다.
coupon = "이벤트 2026"
print("2026" in coupon)
print(str(2026) in coupon)
True
True
고정된 글자를 찾을 때는 따옴표를 붙여 "2026"으로 쓰고, 숫자 변수라면 str()로 문자열로 바꿀 수 있습니다. 숫자와 문자열의 차이는 파이썬 자료형 기초에서 더 자세히 확인할 수 있습니다.
정리한 뒤 찾으면 사용자 입력에도 흔들리지 않는다
사용자가 PYTHON, Python, python 중 무엇을 입력할지 알 수 없다면 검색 전에 양쪽을 같은 기준으로 정리합니다.
raw_message = " PYTHON Cafe Open "
keyword = "python"
clean_message = raw_message.strip().lower()
print(repr(clean_message))
print(keyword in clean_message)
'python cafe open'
True
이 코드는 다음 순서로 움직입니다.
strip()이 양쪽 끝의 불필요한 공백을 없앱니다.lower()가 영문을 소문자로 맞춥니다.in이 정리된 문자열 안에서python을 찾습니다.
in 자체가 대소문자를 무시하는 것은 아닙니다. 검색하기 전에 우리가 비교 기준을 맞춰 준 것입니다. 원본 메시지를 보존하고 clean_message를 따로 만든 이유도 나중에 원래 입력을 다시 확인할 수 있게 하기 위해서입니다.
실행 전에 세 문제를 먼저 맞혀 보기
아래 결과를 실행하기 전에 머릿속으로 예상해 보세요.
sentence = "오늘은 파이썬 공부하는 날"
print("파이썬" in sentence)
print("파 이 썬" in sentence)
print("자바" not in sentence)
정답은 차례대로 True, False, True입니다. 첫 번째는 글자가 연속해서 있고, 두 번째는 찾는 문자열에 추가된 공백이 원문에는 없으며, 세 번째는 자바가 들어 있지 않기 때문입니다.
이제 in을 볼 때 “포함 연산자”라는 이름만 떠올리기보다 다음 질문으로 읽어 보세요.
왼쪽 문자열이 오른쪽 문자열 안에
같은 순서로 끊기지 않고 놓여 있는가?
대답이 True 또는 False면 충분할 때 in이 가장 자연스럽습니다. 그 대답에 따라 서로 다른 코드를 실행하고 싶다면 Python if문 사용법을 이어서 보면 됩니다.
참고
대표 이미지는 글의 주제를 나타내기 위해 이미지 생성 도구로 제작한 일러스트이며, 실제 Python 실행 화면은 아닙니다.
'IT프로그래밍 > 파이썬' 카테고리의 다른 글
| 파이썬 try except 사용법 : ValueError와 KeyError 예외 처리 (0) | 2026.08.20 |
|---|---|
| 파이썬 set 사용법 : 리스트 중복 제거와 순서 유지 방법 (0) | 2026.08.18 |
| 파이썬 튜플과 리스트 차이 : 원소 1개에는 왜 쉼표가 필요할까 (0) | 2026.08.14 |
| 파이썬 딕셔너리 사용법 : KeyError를 get으로 막는 가장 쉬운 방법 (0) | 2026.08.14 |
| 파이썬 문자열 메서드 기초 : strip과 replace는 원본을 바꿀까 (0) | 2026.08.10 |
| 파이썬 문자열 기초 : 글자는 왜 0번부터 셀까 (0) | 2026.08.09 |
| 파이썬 산술 연산자 기초 : /, //, %는 무엇이 다를까 (0) | 2026.08.08 |
| 파이썬 변수 기초 : 값에 이름을 붙이면 무엇이 편해질까 (0) | 2026.08.07 |
댓글