- 4
- 이니스프리
- 조회 수 1398
For 반복문에 대한 글을 작성하다가 몇 번 날려먹었습니다 ㅠㅠ
부득이 문자열 처리 강좌를 먼저 올립니다.
1. 문자열을 인덱스로 접근하기
다들 아시다시피 파이썬에서는 문자열을 양수 또는 음수의 인덱스로 접근할 수 있고, 더 나아가 인덱스 '범위'로 접근할 수 있습니다.
string = 'Hello, world!' print(string[3:-2])
=> 'lo, worl'
인덱스 '범위'로 접근할 때에는 인덱스와 비교하여 다음과 같은 몇 가지 장점이 있습니다.
(1) 인덱스 생략
문자열의 앞 또는 뒤의 일부분만 가져올 때 사용하는 방식입니다.
이 때 문자열의 정확한 길이를 지정하지 않아도 되므로 굉장히 유용합니다.
string = 'Hello, world!' print(string[:5])
=> 'Hello'
string[5:len(string)]과 string[5:]는 결과적으로 동일합니다.
참고로 string[::-1]이라고 하면 문자열을 뒤집을 수 있습니다.
리스트와 달리 스트링에서는 .reverse()라는 메서드가 존재하지 않으므로 유용하게 활용할 수 있습니다.
(2) 에러의 회피
인덱스를 바로 접근하는 경우에 인덱스 범위를 벗어나면 "IndexError: string index out of range" 에러가 발생합니다.
그러나 인덱스 범위로 접근하면 이러한 오류를 미연에 방지할 수 있습니다.
s = 'hello' print(s[10])
s = 'hello' print(s[-10:10])
첫 번째 스크립트에서는 에러가 발생하지만, 두 번째 스크립트에서는 s[-10]과 s[10]이 존재하지 않음에도 불구하고 정상적으로 작동합니다.
시중의 일부 교재에서 이 부분에 대한 설명이 누락되어 있던데, 저처럼 엉성한 스크립트라도 일단 구동이 되도록 작성하는 것이 목표인 사람에게는 꽤나 유용합니다 ^^
심지어 문자열이 공백인 경우에도 에러를 회피할 수 있다는 것이 장점입니다.
2. 문자열을 인덱스로 접근하여 값을 할당하기?? (X)
파이썬에서는 아쉽게도 문자열을 인덱스로 접근하여 그 내용을 변경하는 함수나 메서드를 제공하지 않습니다.
따라서 var_string[3] = 'a' 이런 식의 할당은 불가능합니다.
이것이 문자열과 리스트와의 차이점입니다!!
만약 문자열을 인덱스로 접근하고 싶다면, 우선 list() 함수를 이용하여 문자열을 리스트로 변환한 후, 리스트를 인덱스로 접근하여 그 요소를 변경하고, 이를 다시 join() 함수로 합쳐서 문자열로 전환해야 합니다.
(구체적인 방법은 퀴즈의 1번 해설을 참고하세요.)
비록 문자열 인덱스에 직접적으로 접근하여 조작하는 방법은 없지만, 유사한 작업을 수행함에 있어서 다음 강좌에서 살펴볼 .replace() 메서드를 제공하고 있으며, 정규식을 이용해서도 우회적으로 목적을 달성할 수 있을 것입니다.
3. 문자열을 for 반복문으로 접근하기
for 문에 문자열을 지정하면 1개의 글자로 된 문자열을 하나씩 가져옵니다.
for s in 'study': print(s, end=' ')
=> s t u d y
4. 문자열 검색 - 문자열에 특정 문자열이 포함되어 있는지 확인하기
굳이 정규식을 사용하지 않더라도 문자열에 특정 문자열이 포함되어 있는지 확인할 수 있습니다.
print('ll' in 'hello')
=> True
참고로 파이썬에서는 문자열을 찾아서 인덱스를 반환하는 .find() 메서드를 제공하고 있으며, 이는 PHP에서의 strpos() 함수와 유사한 기능합니다.
PHP에서 if (strpos("검색할 대상인 문자열", "찾고 싶은 문자열") !== false) {} 이런 식으로 문자열 포함 여부를 확인한다면, 파이썬에서는 보다 직접적인 방법을 제공하고 있다고 하겠습니다.
.find() 메서드의 활용법에 대해서는 다음 강좌에서 살펴보겠습니다.
5. Quiz
문자열이 매개변수로 주어졌을 때 문자열에서 'a'를 'x'로 변경하고 이를 리턴하는 func 함수를 작성하시오.
해설:
1) 리스트로 변환한 후 인덱스로 접근하여 합치는 방법
def func(str): s_list = list(str) for i in range(len(s_list)): if s_list[i] == 'a': s_list[i] = 'x' return ''.join(s_list) # 리스트를 join()으로 합쳐서 문자열로 변환합니다.
2) 리스트로 변환하지 않고 for문으로 스트링을 더해주는 방법
def func(str): result = '' for c in str: if c == 'a': c = 'x' result += c # 문자열 더하기를 이용합니다. return result
위 방법을 응용하면 예컨대 전화번호의 '-'를 '.' 또는 ''로 변경하는 경우에 굳이 정규표현식을 사용하지 않고서도 빠른 변환이 가능할 것입니다.
6. 마치며
지금까지 문자열에 대한 접근 및 검색방법에 대해 살펴보았습니다.
다음 강좌에서는 문자열과 관련된 파이썬의 기본 메서드에 대해 살펴보겠습니다.
부족한 강좌를 읽어주셔서 감사합니다 ^^
작성자
댓글 4
저는 그런 개념을 몰라서 그냥 암기했는데 덕분에 잘 이해했습니다!
감사합니다 ^o^
유용한 팁이네요!
일부 코딩사이트에서 문제를 풀 때 try ~ except 문을 사용하면 시간초과가 뜨는 경우가 많던데, 저런 방식으로 에러를 회피하더군요~
맛스타 님께서도 즐겁고 뜻깊은 연말 되세요!
=> 이 부분에 좀 더 첨언을 하자면 문자열의 경우에는 Immutable 이기 때문에 인덱스로 수정이 불가하지만, 리스트의 경우에는 Mutable이기 때문에 인덱스로 수정이 가능합니다.