- 1
- 이니스프리
- 조회 수 759
안녕하세요?
이번 강좌에서는 저번에 미처 올리지 못한 문자열 조작과 관련된 부분을 정리하겠습니다.
파이썬으로 업무자동화 스크립트를 작성할 때 마지막 단계에서 문자열 처리를 해주어야 되는 경우가 많으며, 특히 웹 크롤링에서 원하는 문자열만 추출해야 하는 경우에 문자열 처리가 매우 중요합니다.
다행히 파이썬에서도 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() 등을 비롯하여 문자열 처리와 관련된 다양한 함수 및 메서드를 제공하고 있습니다.
그럼 편안한 밤 되시고, 다음 강좌에서 뵙겠습니다 ^^
참조 : https://studyforus.com/tipnknowhow/642439