파이썬 문자열 찾기

파이썬 문자열 찾기

문자열 안에 문자열 찾기

매우 유용한 문자열 함수 중에 하나가 바로 find() 함수이다. 이름이 암시하듯이, 이 함수를 사용해서 한 문자열의 위치를 다른 문자열에서 찾을 수 있다 - 보통 이런 부분 문자열을 서브스트링(substring)이라고 불린다.

find() 함수는 사용하기 위해서는 .find()를 변수나 문자열 리터럴 뒤에 위치 시키고 괄호 사이에 찾고 싶은 문자열을 입력하면 된다.

>>> phrase = "the surprise is in here somewhere"
>>> phrase.find("surprise")
4

find() 함수는 입력한 문자열이 처음 발견되었을 때의 인덱스를 반환한다. 위 예제에서는 "surprise"라는 문자열이 전체 문장에서 5번째 문자, 즉 인덱스로는 4번째에서 발견되었기 때문에 숫자 4가 반환된 것을 확인할 수 있다.

만약 find() 함수가 희망하는 서브스트링을 찾지 못한다면, 대신 -1을 반환한다.

>>> phrase = "the surprise is in here somewhere"
>>> phrase.find("eyjafjallajökull")
-1

find() 함수 사용시 고려해야 할 점

find() 함수를 사용하며 고려해야 할 몇 가지 부분들이 있는데, 다음과 같다.

1. 대소문자를 구별한다.

찾으려고하는 문자가 있어도 대소문자 구별때문에 완벽히 매칭하지 않으면 -1이 리턴되니 조심하자.

>>> "the surprise is in here somewhere".find("SURPRISE")
-1

2. 처음 발견한 문자열의 인덱스만 반환한다.

왼쪽(시작점)을 기준으로 처음 찾은 문자열의 첫 인덱스만 반환한다.

>>> "I put a string in your string".find("string")
8

3. 오직 문자열만 입력 가능하다.

숫자나 다른 타입과 함수를 사용할 수 없다. 오직 문자열만 가능하다. 정수를 문자열 안에서 찾고 싶다면 정수를 문자열 형식으로 보내야 한다.

>>> "My number is 555-555-5555".find(5)
Traceback (most recent call last):
	File "<stdin>", line 1, in <module>
TypeError: must be str, not int

>>> "My number is 555-555-5555".find("5")
13

문자열 대체하기

문자열을 찾는 것을 넘어, 문자열을 찾고 다른 문자열로 대체해야하는 경우도 있을 것이다. 또한, find() 함수는 처음 발견한 문자열의 인덱스만 찾아줌으로 작업을 수행하는데 사용하기 쉽지는 않다. 파이썬 문자열 객체에는 replace() 라는 함수가 존재하는데, replace() 함수를 사용하면 서브스트링의 각 인스턴스를 다른 문자열로 바꾸어줄 수 있다.

find() 함수와 마찬가지로 replace() 함수도 변수나 문자열 리터럴 뒤에 위치 시킨다. 한 가지 다른점은 괄호안에 대체할려는 서브스트링을 먼저 입력하고, 콤마로 구분한 뒤 대체하려는 문자열을 입력하면 된다. 다음 예제를 살펴보자.

>>> my_story = "I'm telling you the truth; nothing but the truth!"
>>> my_story.replace("the truth", "lies")
"I'm telling you lies; nothing but lies!"

파이썬에서 문자열은 불변객체이므로 replace() 함수를 사용해도 변수 my_story가 변하지 않는다는 것을 확인할 수 있다.

>>> my_story
"I'm telling you the truth; nothing but the truth!"

변수의 값을 변경하고 싶다면 재할당을 해주어야 한다.

>>> my_story = my_story.replace("the truth", "lies")
>>> my_story
"I'm telling you lies; nothing but lies!"

replace() 함수는 오직 하나의 서브스트링만 대체할 수 있으므로(물론, 동일한 서브스트링이 여러 개라면 동시에 바뀐다), 다수의 서브스트링을 대체하고 싶다면 함수를 여러번 사용해야 한다.

>>> text = "some of the stuff"
>>> new_text = text.replace("some of", "all")
>>> new_text = new_text.replace("stuff", "things")
>>> new_text
'all the things'

Reference