• 목록
  • 아래로
  • 위로


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. 마치며


지금까지 문자열에 대한 접근 및 검색방법에 대해 살펴보았습니다.


다음 강좌에서는 문자열과 관련된 파이썬의 기본 메서드에 대해 살펴보겠습니다.


부족한 강좌를 읽어주셔서 감사합니다 ^^


작성자
이니스프리 119 Lv. (2%) 4188180/115200000EXP

Make StudyForUs Great Again!

 

CSVpuymXAAAVVpd.jpg

댓글 4

title: 황금 서버 (30일)humit
profile image
2. 문자열을 인덱스로 접근하여 값을 할당하기??
=> 이 부분에 좀 더 첨언을 하자면 문자열의 경우에는 Immutable 이기 때문에 인덱스로 수정이 불가하지만, 리스트의 경우에는 Mutable이기 때문에 인덱스로 수정이 가능합니다.
comment menu
2019.12.11. 16:15

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → humit
profile image
그게 개념상 immutable과 mutable의 차이었군요~
저는 그런 개념을 몰라서 그냥 암기했는데 덕분에 잘 이해했습니다!
감사합니다 ^o^
comment menu
2019.12.11. 18:22

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

NoYeah
profile image
인덱스에서 범위로 지정하면 오류가 나지 않는 사실을 처음 일았습니다.
유용한 팁이네요!
comment menu
2019.12.12. 09:14

신고

"NoYeah님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → NoYeah
profile image

일부 코딩사이트에서 문제를 풀 때 try ~ except 문을 사용하면 시간초과가 뜨는 경우가 많던데, 저런 방식으로 에러를 회피하더군요~

맛스타 님께서도 즐겁고 뜻깊은 연말 되세요!

comment menu
2019.12.12. 12:24

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
29 [번외편 - 구글뉴스] 리뉴얼된 구글뉴스에서 RSS 피드를 생성하는 방법 6 image 이니스프리 이니스프리 18.10.07.17:58 3671
28 [번외편 - 아미나] 그누보드/아미나에서 게시글의 날짜를 최종수정일로 변경하고, 목록스킨 및 위젯을 최종수정일 순으로 정렬하기 2 image 이니스프리 이니스프리 18.11.11.22:36 2690
27 [번외편 - 법률] 현행 저작권법 제30조(사적이용을 위한 복제)에 대하여 - 음원 다운로더의 처벌과 관련하여 6 이니스프리 이니스프리 18.12.07.14:16 1434
26 [번외편 - 아미나] 아미나의 회원 이미지와 관련하여 x2 3 image 이니스프리 이니스프리 18.12.10.19:57 860
25 [번외편 - 아미나] Basic Youtube Title Widget 1.0에서 처음에 엑박으로 뜨는 경우의 해결책 3 image 이니스프리 이니스프리 18.12.15.23:02 900
24 [Selenium] Selenium에서 send_keys를 막아놓은 경우 해결책 이니스프리 이니스프리 19.07.04.05:52 4867
23 [번외편 - 유튜브] Youtube API를 이용하거나 또는 이용하지 않고 채널ID를 추출하는 방법 2 image 이니스프리 이니스프리 19.07.16.17:55 2923
22 [번외편 - 법률] 나무위키의 서술 중 법률용어의 사용에 있어 바로잡아야 할 부분 image 이니스프리 이니스프리 19.07.17.22:44 522
21 [Pillow] 파이썬 Pillow 라이브러리를 이용하여 이미지의 배경을 transparent하게 만들기 11 image 이니스프리 이니스프리 19.08.04.13:40 7996
20 (序) Python 강좌를 시작하며... 2 image 이니스프리 이니스프리 19.12.05.21:55 649
19 1. 반복문 (1) - while 문 7 image 이니스프리 이니스프리 19.12.06.20:50 2660
18 [Selenium] Requests의 session을 Selenium으로 보내기 image 이니스프리 이니스프리 19.12.07.14:17 4922
3. 문자열 처리 (1) - 문자열 접근 및 검색방법 4 image 이니스프리 이니스프리 19.12.09.20:00 1368
16 6. 리스트와 관련된 기본함수 및 메서드 7 image 이니스프리 이니스프리 19.12.10.21:16 2224
15 4. 문자열 처리 (2) - 문자열 조작에 대한 기본함수 및 메서드 1 image 이니스프리 이니스프리 19.12.12.02:27 759
14 [번외편] 네이버 동영상에서 자막을 파일로 추출하는 방법 2 image 이니스프리 이니스프리 19.12.25.22:34 5971
13 9. [정리] 파이써닉한 파이썬 문법 팁 for COS Pro image 이니스프리 이니스프리 20.01.04.23:47 1154
12 [Requests] Selenium을 이용한 Cloudflare의 우회 8 image 이니스프리 이니스프리 20.01.08.19:51 6600
11 [python-telegram-bot] 4096자 글자수 제한을 우회하는 방법 image 이니스프리 이니스프리 20.01.12.11:25 2372
10 [BeautifulSoup] 자식태그를 제거하기 - .decompose() & .extract() 10 image 이니스프리 이니스프리 20.01.16.00:07 9463