Problem Solving Through Python

|  파이썬을 활용하여 우리가 PC를 사용하면서 접하는 문제를 보다 간단히 해결하는 내용을 다룹니다. - 기초수준

?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

안녕하세요?


이번 강좌에서는 저번에 미처 올리지 못한 문자열 조작과 관련된 부분을 정리하겠습니다.


파이썬으로 업무자동화 스크립트를 작성할 때 마지막 단계에서 문자열 처리를 해주어야 되는 경우가 많으며, 특히 웹 크롤링에서 원하는 문자열만 추출해야 하는 경우에 문자열 처리가 매우 중요합니다.


다행히 파이썬에서도 Perl만큼은 아니지만 문자열 조작에 관련된 다양한 기본함수 및 메서드를 제공하고 있습니다.


파이썬의 기본함수 및 메서드를 사용하여 문자열을 조작할 수 있는 경우에는 정규표현식을 사용하지 않는 것이 속도 등 퍼포먼스 측면에서 이점이 있습니다.




1. 문자열 검색 - index() & find()


(1) .index() 메서드


.index(검색할 문자열) 메서드는 좌측에서부터 특정 문자열을 검색하여 인덱스를 반환합니다.


이미 눈치를 채셨겠지만 리스트에서 살펴보았던 .index() 메서드와 동일한 기능을 수행합니다.


s = 'November December'
print(s.index('ber'))

=> 5



우측에서부터 검색해야 되는 경우에는 .rindex을 사용할 수 있습니다.


한편 .index()를 사용할 때 주의할 점이 두 가지 있습니다.


(1) 위 예제에서 볼 수 있듯이 'ber'이 두 개 이상 존재하더라도 좌측에서부터 가장 먼저 검색된 인덱스를 반환합니다.


(2) 만약 찾고자 하는 문자열이 존재하지 않는 경우, 에러가 발생합니다.


두 번째 문제점을 예방하기 위하여 try ~ except 문을 사용할 수도 있겠지만, .find() 메소드를 사용하여 해결할 수도 있습니다.



(2) .find() 메서드


.find(검색할 문자열) 메소드는 .index() 메소드와 유사한 기능을 수행하지만, 문자열에서만 사용가능한 검색 메소드입니다.


.index() 메소드와 비교하여 가장 두드러지는 특징은 찾고자 하는 문자열이 존재하지 않는 경우, -1을 반환한다는 점입니다.


s = '마스터'
print(s.find('맛'))

=> -1



우측에서부터 검색을 하고 싶으면 .rfind() 메소드를 사용하면 됩니다.


.rfind()를 사용하더라도 여전히 좌측 기준으로 계산한 인덱스를 반환한다는 점을 주의하셔야 됩니다.


string = 'oxxooooo'
print(string.rfind('xx'))

=> 1 (xx에서 좌측의 x를 기준으로 하여 인덱스를 반환합니다.)




3. 문자열 치환 - replace()


.replace(변경 전 문자열, 변경 후 문자열)은 지정한 문자열을 다른 문자열로 변경합니다.


.replace(변경 전 문자열, 변경 후 문자열, 변경 횟수)와 같은 형식으로 변경 횟수를 지정할 수도 있습니다.


old_string = '일요일'
new_string = old_string.replace('일', '월', 1)
print(new_string)

=> 월요일



위 예제에서 볼 수 있듯이 s.replace()를 한다고 문자열 자체가 변환되는 것이 아니라, 이를 별도의 변수에 다시 넣어주어야 한다는 점에서 리스트에서의 .sort() 메서드 등과 문법상 구별됩니다.




4. 좌우의 공백 또는 문자열 삭제 - strip()


strip이라는 단어의 의미에서 유추할 수 있듯이 .strip() 메서드는 해당 문자열에서 좌우측의 공백을 모두 제거합니다.


공백이 아닌 다른 문자열을 삭제하는 경우에는 .strip(삭제할 문자열)과 같은 형식으로 사용할 수 있습니다.


org_string = '..마스터.마스터.....'
new_string = org_string.strip('.')
print(new_string)

=> 마스터.마스터



위 예제처럼 좌우측에 복수의 '.'가 존재하는 경우에는 이를 모두 삭제합니다.


한편 .lstrip() 또는 rstrip()과 같은 형태로 사용하면 좌측 또는 우측 중 일측의 문자열만 삭제할 수 있습니다.




5. 문자열 분리 - split()


.split() 메서드는 공백을 기준으로 문자열을 분리한 후, 분리된 각 문자열을 리스트의 형태로 반환합니다.


.strip() 메서드와 마찬가지로 구분의 기준이 되는 문자열을 지정하는 용법으로도 사용할 수 있습니다.


예컨대 탭문자를 기준으로 문자열을 분리하는 스크립트입니다.


s = '와플\t샘숭\t헬쥐'
arr = s.split('\t'))
print(arr)

=> ['와플', '샘숭', '헬쥐']



이를 응용하면 list_lines = open('파일명', 'r').read().split('\n')과 같은 형식으로 텍스트 파일에서의 각각의 행을 리스트로 변환할 수 있습니다.


.split(구분할 문자열) 형식으로 사용하는 경우에 구분의 기준이 되는 문자열이 문자열에 존재하지 않더라도 에러가 발생하지 않으며, 문자열 전체를 그대로 리스트에 넣어서 반환합니다.




6. 문자열 삽입 - join()


.join 메서드는 '삽입할 문자열'.join(원래의 문자열)의 형식으로 문자열의 각각의 문자 사이에 원하는 문자열을 삽입하는 역할을 합니다.


old_string = '한중일러'
new_string = 'vs'.join(old_string)
print(new_string)

=> 한vs중vs일vs러



사실 .join() 메서드는 다음과 같이 리스트를 연결하여 문자열을 생성하는 데에 보다 많이 활용됩니다.


east_asia_list = ['한국', '중국', '일본', '러시아']
east_asia_string = 'vs'.join(east_asia_list)
print(east_asia_string)

=> 한국vs중국vs일본vs러시아



.join() 메서드와 .split() 메서드를 함께 이용하면 문자열 안의 모든 공백을 삭제할 수 있습니다.


old_string = ' 스 터 디      포 어 스 '
new_string = ''.join(old_string.split())
print(new_string)

=> 스터디포어스




7. Quiz


다음과 같이 깊이를 달리는 경로들이 문자열로 주어지는 경우, 경로명과 확장자를 제외하고 파일명만 출력하는 스크립트를 작성하시오.

(파일명에 '.'이 포함되어 있는 점을 주의하여야 합니다.)


(1) C:\\Users\\Dobob\\Documents\\xpenology.zip

(2) C:\\Users\\Dobob\\Music\\Animation\\yuru.camp.mp3

(3) C:\\Users\\Dobob\\Documents\\Python\\Script\\beautifulsoup.test.py



해설 1:


.split()과 .join() 메서드를 사용하여 파일명만 출력할 수 있습니다.


name_and_ext = string.split('\\')[-1]
name = '.'.join(name_and_ext.split('.')[:-1]) # ''.join으로 합치면 파일명 내부의 '.'까지 제거됩니다.
print(name)



해설 2:


.rfind() 메서드만을 활용하여 해결하는 것도 가능합니다.


name_and_ext = string[string.rfind('\\') + 1:] # '\\'에서 좌측의 인덱스를 반환하기 때문에 1을 더해줍니다.
name = name_and_ext[:name_and_ext.rfind('.')]
print(name)




8. 마치며


지금까지 문자열 처리에 대한 여러 기본함수 및 메서드를 다뤄보았습니다.


분량상 누락되었지만 파이썬에서는 이외에도 .count(), .zfill(), .upper(), .lower() 등을 비롯하여 문자열 처리와 관련된 다양한 함수 및 메서드를 제공하고 있습니다.


그럼 편안한 밤 되시고, 다음 강좌에서 뵙겠습니다 ^^


  • profile
    이니스프리 2019.12.27 22:44
    .isalnum() 메서드를 사용하면 정규표현식을 사용하지 않고 문자열 내 특수문자 사용 여부를 확인할 수 있습니다.
    참조 : https://studyforus.com/tipnknowhow/642439

Problem Solving Through Python

파이썬을 활용하여 우리가 PC를 사용하면서 접하는 문제를 보다 간단히 해결하는 내용을 다룹니다. - 기초수준

List of Articles
번호 제목 글쓴이 날짜 조회 수
20 [BeautifulSoup] 자식태그를 제거하기 - .decompose() & .extract() file 이니스프리 2020.01.16 113
19 [python-telegram-bot] 4096자 글자수 제한을 우회하는 방법 file 이니스프리 2020.01.12 115
18 [Requests] Selenium을 이용한 Cloudflare의 우회 3 file 이니스프리 2020.01.08 117
17 9. 파이썬 문법 팁 정리 file 이니스프리 2020.01.04 114
16 [번외편] 네이버 동영상에서 자막을 파일로 추출하는 방법 2 file 이니스프리 2019.12.25 157
» 4. 문자열 처리 (2) - 문자열 조작에 대한 기본함수 및 메서드 1 file 이니스프리 2019.12.12 138
14 6. 리스트와 관련된 기본함수 및 메서드 7 file 이니스프리 2019.12.10 145
13 3. 문자열 처리 (1) - 문자열 접근 및 검색방법 4 file 이니스프리 2019.12.09 118
12 [Selenium] Requests의 session을 Selenium으로 보내기 file 이니스프리 2019.12.07 160
11 1. 반복문 (1) - while 문 5 file 이니스프리 2019.12.06 121
10 (序) Python 강좌를 시작하며... 2 file 이니스프리 2019.12.05 103
9 [Pillow] 파이썬 Pillow 라이브러리를 이용하여 이미지의 배경을 transparent하게 만들기 11 file 이니스프리 2019.08.04 513
8 [번외편 - 법률] 나무위키의 서술 중 법률용어의 사용에 있어 바로잡아야 할 부분 file 이니스프리 2019.07.17 174
7 [번외편 - 유튜브] Youtube API를 이용하거나 또는 이용하지 않고 채널ID를 추출하는 방법 1 file 이니스프리 2019.07.16 381
6 [Selenium] Selenium에서 send_keys를 막아놓은 경우 해결책 이니스프리 2019.07.04 289
5 [번외편 - 아미나] Basic Youtube Title Widget 1.0에서 처음에 엑박으로 뜨는 경우의 해결책 3 file 이니스프리 2018.12.15 449
4 [번외편 - 아미나] 아미나의 회원 이미지와 관련하여 x2 3 file 이니스프리 2018.12.10 425
3 [번외편 - 법률] 현행 저작권법 제30조(사적이용을 위한 복제)에 대하여 - 음원 다운로더의 처벌과 관련하여 6 이니스프리 2018.12.07 713
2 [번외편 - 아미나] 그누보드/아미나에서 게시글의 날짜를 최종수정일로 변경하고, 목록스킨 및 위젯을 최종수정일 순으로 정렬하기 2 file 이니스프리 2018.11.11 2124
1 [번외편 - 구글뉴스] 리뉴얼된 구글뉴스에서 RSS 피드를 생성하는 방법 3 file 이니스프리 2018.10.07 1608
목록
Board Pagination Prev 1 Next
/ 1
서버에 요청 중입니다. 잠시만 기다려 주십시오...