• 목록
  • 아래로
  • 위로

안녕하세요?


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


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


다행히 파이썬에서도 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() 등을 비롯하여 문자열 처리와 관련된 다양한 함수 및 메서드를 제공하고 있습니다.


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


gamb1t님 gamb1t 포함 1명이 추천

추천인 1

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

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

 

CSVpuymXAAAVVpd.jpg

댓글 1

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

신고

"이니스프리님의 댓글"

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

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
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
4. 문자열 처리 (2) - 문자열 조작에 대한 기본함수 및 메서드 1 image 이니스프리 이니스프리 19.12.12.02:27 553
14 6. 리스트와 관련된 기본함수 및 메서드 7 image 이니스프리 이니스프리 19.12.10.21:16 2090
13 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