문자열 안에서 찾고 싶은 문자가 몇 번째에 있는지 찾고 싶은 경우가 있습니다.
find 함수를 사용하면 지정한 문자가 어디에 있는지 인덱스(index)를 반환합니다.
그리도 뒤에서부터 찾고 싶은 경우에는 rfind 함수를 사용해서 찾을 수 있습니다.
find 함수
원하는 문자가 몇 번째에 있는지 찾는 예제를 보겠습니다.
str = 'abcabcabc'
index = str.find('b') # index는1 (2번째 문자)
변수 index에는 1이 반환됩니다.
변수 str에 'abcabcabc' 문자 b가 어디에 있는지 find 함수로 검색했습니다.
b는 2번째에 위치해 있지만 인덱스 번호는 0부터 시작하기 때문에 1이 반환됩니다.
만약 지정한 문자를 찾지 못한 경우에는 -1을 반환합니다.
검색 시작 위치 지정 예제
str = 'abcabcabc'
index = str.find('b', 2) # index는 4 (5번째 문자)
find 함수의 두 번째 파라미터(지정값)는 시작 위치를 의미합니다. 생략하는 경우에는 인덱스 0부터 시작합니다.
지정한 경우에는 입력한 위치부터 검색을 시작합니다. 예제에서는 2를 설정했기 때문에 c부터 검색을 시작합니다.
find 함수의 단점=찾고 싶은 문자가 여러개인 경우
그러나 find 함수에는 단점이 있다. 찾고자 하는 특정 문자열이 여러 개인 경우에는 최초 발견 한 녀석의 시작위치만 알려준다. 즉, 그 뒤에 나오는 녀석들의 위치는 알 수가 없다.
대체 방법으로는 substring을 이용하는 것이다. substring 이란 문자열의 일부를 잘라버리는 것인데 아래와 같은 방법으로 쓸 수 있다.
str1 = 'hello world!'
print str1[2:] #'llo world!'
print str1[3:5] #'lo'
print str1[:2] # 'he'
str1[0:] 은 처음 문자부터 끝까지 모두 해당하는 문자열 (str1[:], str1 과 동등!!)
str1[2:] 은 3번째 문자부터 끝까지 의 의미이고
str1[3:5] 은 4번째부터 5번째까지 문자열이고
str1[:2] 은 처음부터 2번째까지 문자열이다.
(매트랩을 사용한 사람들에겐 친숙할 것이다.)
이를 통해 특정 문자열이 여러개 나오는 경우 나오는 시작위치를 모두 반환할 수 있다.
str1 = 'hello world! world world'
str2 = 'world'
a = str1.find(str2)
print a
while str1[a+1:].find(str2) != -1:
a = str1[a+1:].find(str2) + a + 1
print a
<반환값>
6
13
19
위에서 str1[a+1:].find(str2)를 실행하면 a+1의 위치를 0으로 기준을 하여 다음 위치를 반환 하기 때문에 실제 위치는 a+1을 더해줘야 한다. while문을 통해 -1(문자열이 없을 때 반환 되는 값)이 나올 때까지 반복했다.
그러나 substring을 이용한 방법말고 더 깔끔한 방법이 있다. 바로 re 모듈을 사용해 finditer()함수를 이용하는 것이다.
str1 = 'hello world! world world'
str2 = 'world'
for a in re.finditer(str2,str1) :
print a.start()
<반환값>
6
13
19
위에 처럼 for문을 이용하여 re.finditer(특정 문자열, 원래 문자열)을 돌리면 순차적으로 a에 특정 문자열의 iterator 값이 들어가게 된다. 여기서 a.start()를 하면 특정문자열의 시작위치가 반환되고 a.end()를 하면 특정문자열의 끝위치가 반환된다.