티스토리 뷰

1. 문자열 다루기

 

파이썬에서는 큰따옴표(")나 작은따옴표(') 안에 들어 있는 문자의 집합을 문자열이라고 한다. 또한 텍스트 파일의 내용을 읽어 오면 그것도 문자열이 된다. 텍스트 파일을 읽어서 가져온 문자열은 대부분 문자열 처리를 통해 원하는 형태의 데이터로 변환해서 이용한다. 문자열을 처리하기 위해서는 문자열 분리, 불필요한 문자열 제거, 문자열 연결 등을 할 수 있어야 한다. 파이썬에서 문자열을 어떻게 다루는지 알아보겠다.

 

 

문자열 분리하기

 

문자열을 부분 문자열로 나누고 싶을 때는 split( ) 메서드를 이용한다. split( ) 메서드의 사용법은 다음과 같다.

 

str.split([sep]) 

 

split( ) 메서드는 문자열(str)에서 구분자(sepatator)인 sep을 기준으로 문자열을 분리해 리스트로 반환한다. 여기서 소괄호 안의 대괄호([ ]) 부분은 생략할 수 잇다. 구분자(sep)를 입력하지 않고 str.split( )을 수행하면 문자열 사이의 모든 공백과 개행문자(\n)를 없애고 분리된 문자열을 항목으로 담은 리스트를 반환한다.

 

다음과 같이 콤마(,)로 구분된 단어가 여러 개 적힌 문자열이 있을 때 구분자를 콤마(,)로 입력해 split( ) 메서드를 적용하면 콤마를 기준으로 단어를 분리할 수 있다.

 

 In:

 

coffee_menu_str = "에스프레소,아메리카노,카페라테,카푸치노"

coffee_menu_str.split(',')

 Out:

['에스프레소', '아메리카노', '카페라테', '카푸치노']

 문자열을 변수에 할당하지 않고 다음과 같이 문자열에 직접 split( ) 메서드를 사용할 수도 있다.

 

 In:

"에스프레소,아메리카노,카페라테,카푸치노".split(',')

 Out:

['에스프레소', '아메리카노', '카페라테', '카푸치노']

하나의 공백으로 구분된 단어가 여러 개 적힌 문자열은 공백 구분자를 인자로 갖는 split( ) 메서드로 분리할 수 있다.

  

 In:

"에스프레소 아메리카노 카페라테 카푸치노".split(' ')

 Out:

['에스프레소', '아메리카노', '카페라테', '카푸치노']

공백 구분자를 인자로 갖는 split( ) 메서드를 사용할 경우 인자 없이 split( )를 적용할 수 있다.

 

 In:

"에스프레소 아메리카노 카페라테 카푸치노".split( )

 Out:

['에스프레소', '아메리카노', '카페라테', '카푸치노']

문자열에 인자 없이 split( )를 사용하면 문자열 사이의 모든 공백과 개행문자(\n)를 없애고 분리된 문자열을 반환한다. 즉, 단어 사이에 공백과 개행문자가 아무리 많더라도 split( )를 이용하면 공백과 개행문자를 모두 없애고 문자열을 분리할 수 있다.

 

 In:

"    에스프레소   \n\n   아메리카노   \n    카페라테      카푸치노   \n\n".split( )

 Out:

['에스프레소', '아메리카노', '카페라테', '카푸치노']

문자열을 분리할 때 다음과 같이 인자 maxsplit을 추가하면 앞에서부터 원하는 횟수만큼만 문자열을 분리할 수 있다.

 

str.split)[sep ,] maxsplit=숫자) 

 

이 메서드는 문자열(str)을 구분자 sep(생략 가능)을 기준으로 maxsplit만큼 분리해 리스트로 반환한다.

 

다음은 maxsplit을 지정해 문자열을 분리하는 예이다.

 

 In:

"에스프레소 아메리카노 카페라테 카푸치노".split(maxsplit=2)

 Out:

['에스프레소', '아메리카노', '카페라테 카푸치노']

출력 결과에서는 인자로 지정한 maxsplit=2로 인해 앞에서부터 2개의 공백(sep)까지만 문자열을 나눠 결과적으로 3개의 항목이 담긴 리스트를 반환했다.

 

다음은 split( )에서 구분자(sep)와 분할 횟수(maxsplit=숫자)를 모두 지정해 국가 번호까지 있는 전화번호에서 국가 번호를 뺀 나머지 번호를 구하는 예이다.

 

 In:

 

 

 

 

phone)number = "+82-01-2345-6789"    #국가 번호가 포함된 전화번호

split_num = phone_number.split("-", 1)    # 국가 번호와 나머지 번호 분리

 

print(split_num)

print("국내전화번호: {0}".format(split_num[1]))

 Out:

 

['+82', '01-2345-6789']

국내전화번호: 01-2345-6789

 

필요없는 문자열 삭제하기

 

문자열에서는 앞뒤 공백 혹은 개행문자와 같이 불필요한 부분을 지워야 할 때가 있습니다. 이때 사용할 수 있는 것이 strip( ) 메서드입니다. strip( ) 메서드의 사용법은 다음과 같습니다.

 

str. strip([chars]) 

strip( ) 메서드는 문자열(str)의 앞과 뒤에서 시작해서 지정한 문자(chars)외의 다른 문자를 만날 때까지 지정한 문자(chars)를 모두 삭제한 문자열을 반환한다. 만약 지정한 문자(chars)와 일치하는 것이 없으면 문자열(str)을 그대로 반환한다. 지정한 문자(chars)가 여러 개일 경우 순서는 상관이 없다. 지정한 문자(chars) 없이 str.strip( )를 수행하면 문자열 앞과 뒤의 모든 공백과 개행문자(\n)를 삭제한 후에 문자열을 반환한다.

 

다음으로 strip( ) 메서드의 사용 예를 살펴보겠다.

 

문자열 "aaaaPythonaaa"에서 앞뒤의 모든 'a'를 제거하고 싶다면 다음과 같이 없애고자 하는 문자(chars)를 'a'로 지정해서 strip( ) 메서드를 실행하면 된다.

 

 In:

"aaaaPythonaaa".strip('a')

 Out:

'Python'

문자열에서 지우고자 하는 문자가 하나가 아니라 둘이면 strip( ) 메서드를 두 번 사용하면 된다. 우선 다음과 같이 첫 번째로 지우려고 하는 문자를 지정해서 strip( ) 메서드를 실행한다.

 

 In:

 

 

test_str = "aaabbPythonbbbaa"

temp1 = test_str.strip('a') # 문자열 앞뒤의 'a' 제거

temp1

 Out:

'bbPythonbbb'

변수 test_str에 할당한 문자열의 앞과 뒤에서 'a'가 제거됐다. 그 다음으로 두 번째로 지우고자 하는 문자(여기서는 'b')를 지정해서 strip( ) 메서드를 실행한다.

 

 In:

temp1. strip('b') # 문자열 앞뒤의 'b' 제거

 Out:

 'Python'

출력 결과를 보면 test_str 변수에 할당한 문자열에서 앞과 뒤의 'a'와 'b'가 모두 제거됐음을 볼 수 있다. strip( ) 메서드의 경우에는 위와 같이 제거하고자 하는 문자를 하나만 지정해서 여러 번 수행 할 수도 있지만 다음과 같이 지우고자 하는 문자를 모두 지정해서 한 번에 제거할 수도 있다.

 

 In:

test_str.strip('ab') # 문자열 앞뒤의 'a'와 'b' 제거

 Out:

'Python'

지우고자 하는 문자를 여러 개 지정할 때 순서는 상관이 없습니다. 따라서 앞의 예제의 경우 다음과 같이 지우고자 하는 문자의 순서를 바꿔서 지정해도 된다.

 

 In:

test_str.strip('ba')

 Out:

'Python'

다음은 문자열의 앞과 뒤에서 좀 더 많은 문자를 삭제하는 예이다.

 

 In:

test_str_multi = "##***!!!##.... Python is powerful.!... %%!#..   "

test_str_multi.strip('*.#! %')

 Out:

'Python is powerful'

예제에서는 strip( ) 메서드에 '*.#! %'를 인자로 지정해서 문자열의 앞과 뒤의 다양한 문자('*', '.', '#', '!', ' ', '%')를 모두 삭제했다. 인자로 지정한 문자의 순서는 상관없기 때문에 다음과 같이 인자를 지정해도 결과는 같다.

 

 In:

test_str_multi.strip('%* !#.')

 Out:

'Python is powerful'

다음은 strip( ) 메서드를 이용해 문자열 앞뒤의 공백을 제거하는 예이다.

 

 In:

" Python  ".strip(' ')

 Out:

'Python'

문자열 앞뒤의 공백과 개행문자(\n)를 지우고 싶을 때는 다음과 같이 지우고자 하는 문자를 ' \n' 혹은 '\n '로 지정해서 strip( ) 메서드를 실행하면 된다.

 

 In:

"\n Python \n\n".strip(' \n')

 Out:

'Python'

만약 어떤 문자열에서 지우고자 하는 문자가 공백과 개행문자라면 다음과 같이 인자를 지정하지 않고 strip을 실행해도 된다.

 

 In:

"\n Python \n\n".strip( )

 Out:

'Python'

strip( ) 메서드는 문자열(str)의 앞뒤에서 지정한 문자(chars) 외 다른 문자를 만날 때가지만 지정한 문자(chars)를 모두 삭제한다고 했습니다. 따라서 다음과 같이 "aaaBallaaa" 문자열에 strip('a')를 수행하면 'Ball'의 'a'는 지워지지 않습니다.

 

 In:

"aaaBallaaa".strip('a')

 Out:

'Ball'

같은 이유로 공백과 개행문자가 다른 문자들 사이에 있는 문자열에 인자 없이 strip( ) 메서드를 적용하면 문자열의 앞뒤 공백과 개행문자는 모두 삭제되지만 문자열 사이에 있는 공백과 개행문자는 삭제되지 않는다.

 

 In:

"\n This is very \n fast. \n\n".strip( )

 Out:

'This is very \n fast.'

앞에서 살펴본 strip( ) 메서드는 문자열의 앞과 뒤 양쪽을 검색해 지정한 문자를 삭제하는 역할을 한다. 만약 앞이나 뒤 중에서 한족만 삭제하고 싶으면 lstrip( )나 rstrip( ) 메서드를 사용한다. 문자 열 왼쪽(즉, 앞쪽) 부분만 삭제하려면 lstrip( ) 메서드를, 문자열 오른쪽 (즉, 뒤쪽) 부분만 삭제하려면 rstrip( ) 메서드를 이용합니다.

 

다음 예제를 보자

 

 In:

 

 

 

str_lr = "000Python is easy to learn.000"

print(str_lr.strip('0'))

print(str_lr.lstrip('0'))

print(str_lr.rstrip('0'))

 Out:

 

 

Python is easy to learn.

Python is easy to learn.000

000Python is easy to learn.

예제에서는 문자열을 할당한 변수 str_lr에 strip( ), lstrip( ), rstrip( ) 메서드를 각각 적용했다. strip( )를 적용한 결과로 문자열에서 양쪽 모두 0이 삭제되고 lstrip( )이나 rstrip( )을 적용한 결과로 문자열의 왼쪽과 오른쪽에서 각각 0이 삭제됐다.

 

다음으로 콤마와 공백을 포함한 문자열에서 콤마를 기준으로 문자열을 분리하고 공백을 모두 제거 한다. 다음의 coffee_menu 변수에는 콤마와 공백을 포함한 여러 커피 종류가 있다. 우선 split(',')을 이용해 콤마를 구분자로 삼아 문자열을 리스트로 분리한다.

 

 In:

coffee_menu = " 에스프레소, 아메리카노,   카페라테  , 카푸치노 "

coffee_menu_list = coffee_menu.split(',')

coffee_menu_list

 Out:

['  에스프레소', ' 아메리카노', '   카페라테  ', ' 카푸치노  ']

coffe_menu_list에는 공백을 포함한 문자열을 항목으로 갖는 리스트가 반환된다. 다음으로 리스트 변수 coffee_menu_list의 모든 항목에 공백을 제거하기 위해 항목마다 strip( ) 메서드를 적용한다. 공백이 제거된 문자열은 append( )를 이용해 리스트 변수 coffee_list에 하나식 추가하면 최종적으로 원하는 결과를 얻을 수 있다. 이를 구현한 코드는 다음과 같다.

 

 In:

coffee_list = [ ] # 빈 리스트 생성

for coffee in coffee_menu_list:

    temp = coffee.strip( ) # 문자열의 공백 제거

    coffee_list.append(temp) # 리스트 변수에 공백이 제거된 문자열 추가

 

print(coffee_list) #최종 문자열 리스트 출력

 Out:

['에스프레소', '아메리카노', '카페라테', '카푸치노']

 

문자열 연결하기

 

앞에서 더하기 연산자(+)로 두 문자열을 연결하는 방법은 이미 살펴봤다.

 

 In:

 

name1 = "철수"

name2 = "영미"

 

hello = "님, 주소와 전화 번호를 입력해 주세요."

print(name1 + hello)

print(name2 + hello)

 Out:

철수님, 주소와 전화 번호를 입력해 주세요.

영미님, 주소와 전화 번호를 입력해 주세요.

더하기 연산자를 이용하면 문자열과 문자열을 연결할 수 있다. 그럼 문자열이 아니라 리스트의 모든 항목을 하나의 문자열로 만들려면 어떻게 해야 할까? 이때 join() 메서드를 사용할 수 있다.

 

다음은 join() 메서드를 사용하는 방법이다.

 

str.join(seq) 

join() 메서드는 문자열을 항목으로 갖는 시퀀스(seq)의 항목 사이에 구분자 문자열(str)을 모두 넣은 후에 문자열로 반환한다. 여기서 시퀀스는 리스트, 튜플, 세트와 같이 여러 데이터를 담고 있는 나열형 데이터이다.

 

다음은 join( ) 메서드를 이용해 문자열 리스트를 문자열로 변환하는 예이다. 이를 위해 문자열을 항목으로 갖는 리스트를 생성하겠다.

 

 In:

 

address_list = ["서울시", "서초구", "반포대로", "201(반포동)"]

address_list

 Out:

['서울시', '서초구', '반포대로', '201(반포동)']

문자열 리스트(address_list)를 공백으로 연결해서 문자열을 생성하고 싶다면 다음과 같이 작성해야 한다. 여기서 구분자 문자열은 한 칸의 공백이 된다.

 

 In:

a = " "

a.join(address_list)

 Out:

'서울시 서초구 반포대로 201(반포동)'

구분자 문자열을 변수에 할당하지 않고 다음과 같이 직접 지정할 수도 있다.

 

 In:

" ".join(address_list)

 Out:

'서울시 서초구 반포대로 201(반포동)'

다음은 문자열 리스트를 여러 문자로 이뤄진 구분자 문자열("*^-^*")로 연결해서 문자열로 변환한 예이다

 

 In:

"*^-^*".join(address_list)

 Out:

'서울시*^-^*서초구*^-^*반포대로*^-^*201(반포동)'

 

문자열 찾기

 

이번에는 문자열에서 원하는 단어를 찾을 때 사용할 수 있는 find() 메서드에 대해 알아보겠다.

 

str.find(search_str) 

find() 메서드는 문자열(str)에서 찾으려는 검색 문자열(search_str)과 첫 번재로 일치하는 문자열(str)의 위치를 반환한다. 여기서, 문자열의 위치는 0부터 시작한다. 만약 문자열에서 검색 문자열을 찾을 수 없으면 -1을 반환한다.

 

다음은 find()를 이용해 문자열에서 특정 문자열의 위치를 찾는 예이다. 특정 문자열을 찾아서 맨 처음 발견된 위치를 반환하고 찾으려는 문자열이 없으면 -1을 반환한다.

 

 In:

 

 

 

 

 

str_f = "Python code."

 

print("찾는 문자열의 위치:", str_f.find("Python"))

print("찾는 문자열의 위치:", str_f.find("code"))

print("찾는 문자열의 위치:", str_f.find("n"))

print("찾는 문자열의 위치:", str_f.find("easy"))

 Out:

 

 

 

찾는 문자열의 위치: 0

찾는 문자열의 위치: 7

찾는 문자열의 위치: 5

찾는 문자열의 위치: -1

str.find(search_str)에 다음과 같이 시작 위치(start)와 끝 위치(end)를 추가로 지정해서 검색 범위를 설정할 수도 있다.

 

str.find(search_str, start, end) 

이때 start ~ end-1 범위에서 검색 문자열 (search_str)을 검색해 일치하는 문자열(str)의 위치를 반환한다. 지정된 범위에서 찾지 못하면 -1을 반환한다.

 

다음과 같이 시작 위치만 지정해서 검색 범위를 설정할 수도 있다.

 

str.find(search_str, start) 

 

이대 검색 범위는 start부터 문자열(str)의 끝이 된다.

 

다음은 시작 위치와 끝 위치를 지정해 문자열을 찾는 예이다.

 

 In:

 

 

 

str_f_se = "Python is powerful. Python is easy to learn."

 

print(str_f_se.find("Python", 10, 30)) # 시작 위치(start)와 끝 위치(end) 지정

print(str_f_se.find("Python", 35)) # 찾기 위한 시작 위치(start) 지정

 Out:

 

20

-1

find() 메서드는 찾으려는 문자열과 일치하는 첫 번째 위치를 반환한다. 만약 해당 문자열이 몇 번 나오는지 알고 싶다면 count( ) 메서드를 이용한다.

 

str.count(search_str) 

str.count(search_str, start)

str.count(search_str, start, end)

count() 메서드는 문자열(str)에서 찾고자 하는 문자열(search_str)과 일치하는 횟수를 반환하고, 없으면 0을 반환한다. find()와 마찬가지로 start와 end로 검색 범위를 지정할 수도 있다.

 

다음 예제를 보자

 

 In:

 

 

 

 

str_c = "Python is powerful. Python is easy to learn. Python is open."

 

print("Python의 개수는?.", str_c.count("Python"))

print("powerful의 개수는?:", str_c.count("powerful"))

print("IPython의 개수는?:", str_c.count("IPython"))

 Out:

 

 

Python의 개수는?: 3

powerful의 개수는?: 1

IPython의 개수는?: 0

또 다른 찾기 메서드로 startwith( ) 메서드와 endwith( ) 메서드가 있다. 각각 문자열이 지정된 문자열로 시작하는지 끝나는지를 검사할 때 사용한다. 사용법은 다음과 같다.

 

str.startwith(prefix)

str.startwith(prefix, start)

str.startwith(prefix, start, end)

startwith() 메서드는 문자열(str)이 지정된 문자열(prefix)로 시작되면 True를, 그렇지 않으면 False를 반환한다. find( )와 마찾가지로 start와 end로 범위를 지정할 수도 있다.

 

str.endswith(suffix)

str.endswith(suffix, start)

str.endswith(suffix, start, end)

endswith( ) 메서드는 문자열(str)이 지정된 문자열(suffix)로 끝나면 True를, 그렇지 않으면 False를 반환한다. 마찬가지로 start와 end로 범위를 지정할 수도 있다.

 

다음은 startwith( ) 메서드와 endwith( ) 메서드를 사용한 예이다.

 

 In:

 

 

 

 

 

str_se = "Python is powerful. Python is easy to learn. Python is open."

 

print("Python으로 시작?:", str_se.startswith("Python"))

print("is로 시작?:", str_se.startswith("is"))

print(".로 끝?:", str_se.startswith("."))

print("learn으로 끝?:", str_se.startswith("learn"))

 Out:

 

 

 

Python으로 시작?: True

is로 시작?: False

.로 끝?: True

learn으로 끝?: False

 

 

 

 

출처: 파이썬 철저 입문

 

'beginner > 파이썬 분석' 카테고리의 다른 글

모듈  (0) 2019.01.15
문자열과 텍스트 파일 데이터 다루기 ②  (0) 2019.01.15
객체와 클래스 ②  (0) 2019.01.14
객체와 클래스 ①  (0) 2019.01.14
파이썬을 계산기처럼 이용하기  (0) 2019.01.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함