Post List

2017년 7월 24일 월요일

[Python 2.7] 파이썬에서 문자열 내에 특정 문자열 찾기! (find(), substring, re.finditer)

파이썬을 통해 웹사이트의 html문서를 받는 경우가 있다. 이때 문서 내에 특정 단어의 위치를 찾아야 한다면 간단한 함수를 이용할 수 있다. 예시로 'hello world!' 라는 문자열에서 'word'라는 특정 문자열을 찾으려 한다.

1. find() 함수

1
2
3
4
str1 = 'hello world!'
str2 = 'world'
= 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'
    
= 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()를 하면 특정문자열의 끝위치가 반환된다.

각 방법마다 장단점들이 있으니 다양하게 사용해봐야겠다.

댓글 없음:

댓글 쓰기