문자열

데이터 분석에 있어서 문자열(텍스트) 데이터의 중요성

특성

  • 문자열 역시 리스트(list), 튜플(tuple)과 마찬가지로 sequence 형 자료구조를 가집니다.
  • 문자열은 불변(immutable) 객체입니다.

문자열의 생성

파이썬의 문자열은 작은 따옴표() 나 큰 따옴표() 모두 구분없이 사용하여 문자열을 생성할 수 있습니다.

작은 따옴표() 사용

'안녕하세요? 반갑습니다.'
'안녕하세요? 반갑습니다.'

큰 따옴표() 사용

"안녕하세요? 반갑습니다."
'안녕하세요? 반갑습니다.'

작은 따옴표 3개 혹은 큰 따옴표 3개를 써서 여러 줄의 문자열을 생성할 수 있습니다.

sample = '''안녕하세요? 
반가워요
내이름은 
파이썬 입니다.'''

print(sample)
안녕하세요? 
반가워요
내이름은 
파이썬 입니다.
sample = """안녕하세요? 
반가워요
내이름은 
파이썬 입니다.

웰컴!
"""

print(sample)
안녕하세요? 
반가워요
내이름은 
파이썬 입니다.

웰컴!

문자열 출력 (포맷팅)

%를 사용한 출력

"안녕하세요? %s" % ('반갑습니다.')
'안녕하세요? 반갑습니다.'
'안녕하세요? %.3f' % (0.123456)
'안녕하세요? 0.123'
'안녕하세요? %d' % (12345)
'안녕하세요? 12345'
'안녕하세요? %c' % ('a')
'안녕하세요? a'

{} 와 format를 사용한 출력

'웰컴투? {}'.format('파이썬.')
'웰컴투? 파이썬.'
'비밀번호 {}'.format(486)
'비밀번호 486'

소수점 2자리 까지 제한하는 경우 (그 이하자리는 반올림)

'원주율? {:.2f}'.format(3.141592)
'원주율? 3.14'

f 문자열 포맷팅 (python 3.6 이상만 지원)

name = '펭수'
age = 10
print(f'나의 이름은 {name}입니다. 나이는 {age} 살입니다.')
나의 이름은 펭수입니다. 나이는 10 살입니다.
print(f'내년에 저는 {age+1} 살입니다.')
내년에 저는 11 살입니다.
d = {'name':'펭수', 'age':10}
print(f"반가워요. 저는 {d['name']}입니다. 저의 나이는 {d['age']} 살입니다.")
반가워요. 저는 펭수입니다. 저의 나이는 10 살입니다.

문자열 길이

영문 (alphabet)

len('banana')
6

공백은 길이에 포함됩니다.

len('banana pen')
10

한글

len('한글')
2

공백은 길이에 포함됩니다.

len('한글 킹왕짱')
6

인덱싱 (indexing)

  • 문자열에서 한 개의 글자(char)를 조회하기 위해서는 []를 활용한 인덱싱으로 조회할 수 있습니다.
a = 'Python is my life'
a
'Python is my life'
P y t h o n i s m y l i f e
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
a[0]
'P'
a[-2]
'f'

슬라이싱 (Slicing)

  • 슬라이싱의 활용: [start:stop:step] 을 명시하여 부분을 추출할 수 있습니다.
a = 'Python is my life'
a
'Python is my life'
P y t h o n i s m y l i f e
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

[:]을 활용하여 전체를 추출할 수 있습니다.

a[:]
'Python is my life'
P y t h o n i s m y l i f e
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

[start:]는 시작 index 부터 끝까지 추출합니다.

a[3:]
'hon is my life'
a[-4:]
'life'
P y t h o n i s m y l i f e
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

[:end]는 처음부터 end 전까지 추출합니다.

a[:6]
'Python'
a[:-3]
'Python is my l'
P y t h o n i s m y l i f e
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

[start:end]는 start부터 end 전까지 추출합니다.

a[3:6]
'hon'

[start:stop:step]에서 step 지정시 step만큼 건너 뛰면서 추출합니다.

a[::2]
'Pto sm ie'

역순으로 출력하기 위해서는 step을 -1로 지정합니다.

a[::-1]
'efil ym si nohtyP'

불변(immutable)

  • 문자열은 index를 통해 값을 수정 및 변경이 불가합니다.
  • 하지만 메서드(method)로 변경할 수 있습니다.
a = 'Python is my life'

index에 값을 할당하여 변경하려는 경우

a[2] = 'Y'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-37-f2db0e8f1888> in <module>
----> 1 a[2] = 'Y'

TypeError: 'str' object does not support item assignment

del로 부분 삭제하려는 경우

del a[2]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-38-734682c6a06c> in <module>
----> 1 del a[2]

TypeError: 'str' object doesn't support item deletion

문자열의 덧셈과 곱셈

연결: 문자열의 덧셈

덧셈은 문자열을 연결합니다.

a = '반갑습니다!'
b = '웰컴 투 파이썬'
a + b
'반갑습니다!웰컴 투 파이썬'
a + '???'
'반갑습니다!???'
'hello' + ', world'
'hello, world'

복제: 문자열의 곱셈

문자열을 곱한 숫자 만큼 반복하여 생성합니다.

a * 2
'반갑습니다!반갑습니다!'
print('abc ' * 5)
print('===' * 7)
abc abc abc abc abc 
=====================

문자열의 list, set

리스트(list)

  • 문자열을 리스트(list)로 타입 변환이 가능합니다.
  • 타입 변환시 한 글자를 요소로 갖는 리스트가 생성됩니다.
list('ABCDE')
['A', 'B', 'C', 'D', 'E']

세트(set)

  • 한 글자를 요소로 갖는 세트가 생성됩니다.
  • 세트의 특성상 요소를 생성한 후 중복된 글자는 제거됩니다.
set('AAABBBCCC')
{'A', 'B', 'C'}

중복이 제거된 리스트로 생성하기 위해서는 list로 다시 타입 변환합니다.

list(set('AAABBBCCC'))
['A', 'B', 'C']

문자열(텍스트)을 다루는 다양한 기능, 메서드(method)

문자열만 가지고 있는 고유의 편한 기능들이 있습니다.

우리는 이들 중 몇 가지를 배워 앞으로 유용하게 활용할 예정입니다.

split() : 분리

  • split은 문장을 특정 규칙에 의해 쪼개 주는 기능을 합니다.
  • 분리한 결과는 list 형식으로 값을 return 받습니다.
a = 'This is a pen'

기본 값으로 공백이 지정되어 있습니다. 즉, 공백을 기준으로 분리하여 리스트로 반환합니다.

a.split()
['This', 'is', 'a', 'pen']

기본 값인 공백에서 특정 문자로 지정할 수 있습니다.

a = 'This-is-a-pen'
a.split('-')
['This', 'is', 'a', 'pen']
aa = a.split('-')
aa
['This', 'is', 'a', 'pen']

aa에 반환된 리스트를 대입 후 index로 값을 조회할 수 있습니다.

aa[0]
'This'
aa[2]
'a'
aa[0] + aa[2]
'Thisa'

한글도 동일하게 적용됩니다.

a = '한글은 어떻게 될까요?'
a.split()
['한글은', '어떻게', '될까요?']

join() : 합치기

  • 결합하고자 하는 문자에 .join() 안에 리스트를 지정하여 결합할 수 있습니다.
'-'.join(['010',  '1234', '5678'])
'010-1234-5678'
'-'.join('ABCDE')
'A-B-C-D-E'

lower(), upper() : 소문자 / 대문자로 만들기

a = 'My name is Teddy'

소문자로 변경

a.lower()
'my name is teddy'

대문자로 변경

a.upper()
'MY NAME IS TEDDY'

한글에는 대소문자 구분이 없습니다.

a = '한글엔 대소문자가 없어요ㅠ'
a.lower()
'한글엔 대소문자가 없어요ㅠ'
a.upper()
'한글엔 대소문자가 없어요ㅠ'

startswith, endswith

시작과, 끝이 맞는지 결과를 bool로 반환합니다.

a = '01-sample.png'

startswith() : 시작하는

  • 지정한 문자열로 시작하면 True, 그렇지 않다면 False를 반환합니다.
a.startswith('01')
True
a.startswith('02')
False

endswith() : 끝나는

  • 지정한 문자열로 끝나면 True, 그렇지 않다면 False를 반환합니다.
a.endswith('.png')
True
a.endswith('.jpg')
False

replace() : 문자열 바꾸기

  • 문자열에 replace(바꿀 대상, 바꾸려는 문자열) 지정하여 문자열을 변경합니다.
  • 결과는 복사본이 만들어져 반환됩니다.
a = '01-sample.png'
a.replace('.png', '.jpg')
'01-sample.jpg'

반환값은 복사본이며 원본에 변경사항이 바로 적용되지 않습니다.

a
'01-sample.png'
new_a = a.replace('.png', '.jpg')
print(new_a)
01-sample.jpg

불필요한 공백 제거

a = '    01-sample.png                '
print(a)
    01-sample.png                

strip은 불필요한 공백을 제거해 줍니다.

lstrip() : 왼쪽 공백 제거

a.lstrip()
'01-sample.png                '

rstrip() : 오른쪽 공백 제거

a.rstrip()
'    01-sample.png'

strip() : 양쪽 공백 제거

a.strip()
'01-sample.png'