1. find() 함수
1 2 3 4 | str1 = 'hello world!' str2 = 'world' a = str1.find(str2) print str1[a] | cs |
find 함수를 통해 찾고자 하는 특정 문자열을 입력하면 반환 값으로 그 문자열의 시작위치가 나온다. 따라서 str1[a]의 값은 str2가 나오는 문자열의 시작위치로 'w'가 된다. 만약 찾고자 하는 문자열이 없다면 반환값으로 -1을 보낸다.
그러나 find 함수에는 단점이 있다. 찾고자 하는 특정 문자열이 여러 개인 경우에는 최초 발견 한 녀석의 시작위치만 알려준다. 즉, 그 뒤에 나오는 녀석들의 위치는 알 수가 없다.
2. substring
대체 방법으로는 substring을 이용하는 것이다. substring 이란 문자열의 일부를 잘라버리는 것인데 아래와 같은 방법으로 쓸 수 있다.1 2 3 4 5 6 7 | str1 = 'hello world!' print str1[2:] >>> 'llo world!' print str1[3:5] >>> 'lo' print str1[:2] >>> 'he' | cs |
str1[0:] 은 처음 문자부터 끝까지 모두 해당하는 문자열 (str1[:], str1 과 동등!!)
str1[2:] 은 3번째 문자부터 끝까지 의 의미이고
str1[3:5] 은 4번째부터 5번째까지 문자열이고
str1[:2] 은 처음부터 2번째까지 문자열이다.
(매트랩을 사용한 사람들에겐 친숙할 것이다.)
이를 통해 특정 문자열이 여러개 나오는 경우 나오는 시작위치를 모두 반환할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 | 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 | cs |
위에서 str1[a+1:].find(str2)를 실행하면 a+1의 위치를 0으로 기준을 하여 다음 위치를 반환 하기 때문에 실제 위치는 a+1을 더해줘야 한다. while문을 통해 -1(문자열이 없을 때 반환 되는 값)이 나올 때까지 반복했다.
3. re.finditer() 함수
그러나 substring을 이용한 방법말고 더 깔끔한 방법이 있다. 바로 re 모듈을 사용해 finditer()함수를 이용하는 것이다.1 2 3 4 5 6 7 8 9 | str1 = 'hello world! world world' str2 = 'world' for a in re.finditer(str2,str1) : print a.start() >>> 6 13 19 | cs |
위에 처럼 for문을 이용하여 re.finditer(특정 문자열, 원래 문자열)을 돌리면 순차적으로 a에 특정 문자열의 iterator 값이 들어가게 된다.
여기서 a.start()를 하면 특정문자열의 시작위치가 반환되고
a.end()를 하면 특정문자열의 끝위치가 반환된다.
각 방법마다 장단점들이 있으니 다양하게 사용해봐야겠다.
댓글 없음:
댓글 쓰기