• 목록
  • 아래로
  • 위로


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. (0%) 1876250/115200000EXP

당분간 일신상의 사정으로 쪽지나 댓글로 답변을 드리기 어렵습니다. 죄송합니다.

 

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 [디지털포렌식전문가] 제21회 필기시험 합격 후기 9 image 이니스프리 이니스프리 23.10.29.16:11 2475
28 [Python] GIF 파일에 프로그레스바 삽입하기! (Adding progress bar into GIF) image 이니스프리 이니스프리 22.05.14.13:14 12581
27 [Python] 그누보드 자동 글 작성 + 멀티 파일 업로드 스크립트 1 image 이니스프리 이니스프리 21.05.16.09:32 23690
26 0. 행의 분리 및 결합 / 멀티라인 문자열 image 이니스프리 이니스프리 21.04.18.11:53 447
25 [Selenium] proxy를 사용하지 않고 개발자도구에서 Network 탭의 로그를 얻기 image 이니스프리 이니스프리 21.03.06.23:35 1555
24 [번외편 - 한컴한글] 스마트한 문서 작성을 위한 팁 (작성 중) 이니스프리 이니스프리 20.08.08.13:50 493
23 [Requests-HTML] Requests와 비교할 때의 장점! (네이버 뉴스 등 크롤링) 7 image 이니스프리 이니스프리 20.05.14.19:08 1420
22 22. [OpenPyXL] 엑셀 문서 저장하기 / 시트 추가하기 / 셀에 입력하기 14 image 이니스프리 이니스프리 20.02.02.00:46 5577
21 21. [OpenPyXL] 엑셀 문서를 열고 시트에서 셀의 값을 얻기 3 image 이니스프리 이니스프리 20.02.01.23:46 1269
20 [BeautifulSoup] 자식태그를 제거하기 - .decompose() & .extract() 10 image 이니스프리 이니스프리 20.01.16.00:07 9249
19 [python-telegram-bot] 4096자 글자수 제한을 우회하는 방법 image 이니스프리 이니스프리 20.01.12.11:25 2049
18 [Requests] Selenium을 이용한 Cloudflare의 우회 8 image 이니스프리 이니스프리 20.01.08.19:51 6245
17 9. [정리] 파이써닉한 파이썬 문법 팁 for COS Pro image 이니스프리 이니스프리 20.01.04.23:47 1009
16 [번외편] 네이버 동영상에서 자막을 파일로 추출하는 방법 2 image 이니스프리 이니스프리 19.12.25.22:34 5598
15 4. 문자열 처리 (2) - 문자열 조작에 대한 기본함수 및 메서드 1 image 이니스프리 이니스프리 19.12.12.02:27 553
14 6. 리스트와 관련된 기본함수 및 메서드 7 image 이니스프리 이니스프리 19.12.10.21:16 2090
3. 문자열 처리 (1) - 문자열 접근 및 검색방법 4 image 이니스프리 이니스프리 19.12.09.20:00 1176
12 [Selenium] Requests의 session을 Selenium으로 보내기 image 이니스프리 이니스프리 19.12.07.14:17 4666
11 1. 반복문 (1) - while 문 7 image 이니스프리 이니스프리 19.12.06.20:50 2501
10 (序) Python 강좌를 시작하며... 2 image 이니스프리 이니스프리 19.12.05.21:55 494