파이썬 문자열 찾기: 특정 문자열 위치 개수, find() index() 차이, 여러개 모두 검색, 마지막 인덱스
이번 포스팅에는 파이썬 문자열 찾기 혹은 검색 방법과 관련한 자주 찾는 내용을 모아봤습니다.
1. find() 함수로 특정 문자열 위치 찾기
파이썬에서 문자열을 찾는데 사용되는 가장 기본적인 함수 중 하나는 find()
함수입니다.
이 함수는 한 문자열에서 특정 문자열을 찾아 그 위치를 반환합니다.
만약 해당 문자열이 존재하지 않으면 -1
을 반환합니다.
s = "Hello, Python!"
print(s.find("Python")) # 출력: 7
위의 예제에서 "Python"
이라는 문자열이 "Hello, Python!"
에서 어느 위치에서 시작하는지를 찾을 수 있습니다.
이 경우에는 7
이 반환되며, 이는 문자열 "Python"
이 7번 인덱스에서 시작한다는 것을 의미합니다.
find()
함수는 기본적으로, 찾으려는 문자열이 가장 처음 등장한 위치 인덱스 값을 반환합니다. 문자열 여러개 검색의 경우, 섹션 4를 확인하세요.
또한, 이 함수는 선택적으로 인자 2개를 더 받을 수 있습니다: 시작 인덱스
, 끝 인덱스
입니다. 각각 다음과 같이, 사용할 수 있습니다.
s = "Hello, Python! Python is great."
print(s.find("Python")) # 출력: 7
print(s.find("Python", 10)) # 출력: 15
print(s.find("Python", 0, 15)) # 출력: 7
위의 예제에서, 두 번째 print
문은 find()
함수가 시작 인덱스를 받았을 때 동작을 보여줍니다.
10
번 인덱스부터 찾기 때문에, s[10:]
즉 "hon! Python is great."
이라는 문자열에서 위치를 찾는 것과 같습니다.
이와 비슷한 원리로, 예제의 세 번째 print
문은 끝 인덱스까지 받은 경우이며 s[0:15]
만큼 슬라이싱한 부분 문자열에서 위치를 찾는 것과 같습니다.
만약, 특정 문자열의 마지막 인덱스를 찾고자 한다면, 같은 원리로 동작하는 rfind()
함수를 사용할 수 있습니다.
이 함수는 문자열 제일 마지막에서부터 검색하기 때문에, 특정 문자열이 등장하는 가장 마지막 인덱스를 찾습니다.
참고로, 섹션 2에서 알아볼 index
함수에 대응하는 rindex
함수도 존재합니다.
1.1. 대소문자 구분 없이 찾기
파이썬 문자열 비교 포스트에서 살펴보았듯이, 파이썬 문자열 클래스의 __eq__()
메서드는 유니코드 코드 값을 비교하기 때문에 대소문자를 구분합니다.
만약 find()
함수로 대소문자 구분 없이 문자열의 위치를 찾고자 한다면 upper()
혹은 lower()
메서드를 사용해야 합니다.
다음 코드에서는 대소문자 구분 없는 검색을 위해 찾은 문자열, 찾는 문자열 모두 소문자 변환을 했습니다.
s = "Hello, Python!"
s.lower().find("python".lower()) # 출력: 7
2. find() 함수와 index() 함수의 차이
find()
함수와 index()
함수는 둘 다 문자열 내에서 특정 부분 문자열을 찾는 데 사용되는 메서드입니다.
검색이 성공적으로 이루어졌을 때는 두 메서드의 차이가 보이지 않습니다.
그러나, 검색에 실패하는 경우, 두 메서드의 차이가 확연히 드러납니다.
만약, 찾으려는 문자열이 검색 대상 안에 존재하지 않으면, find()
함수는 -1
값을 반환하며 변다른 예외가 발생하지 않습니다.
하지만, 같은 상황에서 index()
함수는 ValueError
예외를 발생시킵니다.
>>> s = "Hello, Python!"
>>> s.index("python")
Traceback (most recent call last):
File "", line 1, in
ValueError: substring not found
따라서, 파이썬 문자열 찾기 실패 시, 대처할 계획에 따라서 두 메서드 중 적절한 하나를 선택해 사용하는 것이 중요합니다.
3. 특정 문자열 개수 찾기
파이썬에서 특정 문자열 개수를 찾기 위해서 사용하는 메서드는 count()
입니다.
이 메서드는 대상 문자열에서 주어진 부분 문자열이 몇 번 나타나는지 개수를 반환합니다.
find()
메서드, index()
메서드처럼 선택적으로, 검색을 시작하고 끝낼 인덱스를 지정할 수도 있습니다.
기본적인 사용 방법은 다음과 같습니다:
s = "Hello, Python! Python is great."
print(s.count("Python")) # 출력: 2
print(s.count("Python", 2, 14)) # 출력: 1
위 코드 첫 번째 print
문은 "Python"
이라는 문자열이 몇 번 등장하는지를 출력합니다. 이 경우에는 2
가 반환됩니다.
두 번째 print
문은 시작 인덱스, 끝 인덱스를 받았으며, 이에 따라 다른 값을 리턴했습니다.
이처럼 count()
메서드는 문자열 내에서 특정 부분 문자열의 출현 빈도를 빠르게 파악하는 데 유용하며, 문자열 분석이 필요한 다양한 상황에서 활용될 수 있습니다.
4. 문자열 여러개 위치 모두 찾기
파이썬에서 문자열 여러개 위치를 모두 찾기 위해서는 주로 3가지 방식을 사용합니다.
이 중, 첫 번째는 find()
함수를 이용하는 방식이고 나머지는 정규표현식 re
모듈을 이용하는 방식입니다.
4.1. find() 함수로 여러 개의 문자열 찾기
섹션 1에서 언급했지만, 파이썬의 find()
함수는 부분 문자열이 가장 처음 등장하는 인덱스만 반환합니다.
따라서, 여러 문자열의 위치를 찾기 위해서는 반복문과 함께 사용해야 합니다.
다양한 구현 방법이 있겠지만, 여기서는 가장 간단한 구현 코드를 살펴보겠습니다.
s = "Hello, Python! Python is great."
start = 0
while start != -1:
start = s.find("Python", start)
if start != -1:
print(start)
start += 1
위 코드는 find()
함수가 인자로 받는 시작 인덱스와 검색 실패 시 반환하는 -1
값을 이용해서 여러 개의 문자열 위치를 얻고 있습니다.
4.2. re.finditer() 함수로 여러 개의 문자열 위치 가져오기
파이썬 re
모듈은 강력한 정규표현식을 직관적인 패턴과 메서드로 활용할 수 있도록 도와주는 라이브러리입니다.
re
모듈 내 함수 중 finditer()
함수는 특정 패턴에 일치하는 모든 매칭 객체를 이터러블 형식으로 제공합니다.
이 매칭 객체가 위치 인덱스를 포함하기 때문에 여러 문자열 위치를 찾을 때 유용하게 사용할 수 있습니다.
위치 인덱스는 매칭 객체의 .start()
메서드로 얻습니다.
사용 방법은 다음과 같습니다.
import re
s = "Hello, Python! Python is great."
matches = re.finditer("Python", s)
indices = [match.start() for match in matches]
print(indices) # 출력: [7, 15]
위와 같이 리스트 컴프리헨션과 사용하는 등 다양하게 활용할 수 있습니다.
5. 마치며
이번 포스팅은 파이썬 문자열 찾기 관련 4가지 내용을 살펴보았습니다. 문자열 조작을 강력하게 지원하는 파이썬인 만큼, 다양한 방법으로 부분 문자열을 검색할 수 있었습니다. 이번 포스팅 내용도 실제 프로젝트 환경에서 도움이 되었으면 좋겠습니다.