문자열은 문자열을 조작하거 정보를 얻는 다양한 메서드(메서드는 나중에 뒤에서 설명)를 제공한다. 여기서는 자주 사용되는 메서드만 설명하겠다.
replace('바꿀문자열', '새문자열')
은 문자열을 바꿔준다. (문자열 자체는 변하지 않으며 바뀐 문자열을 반환한다). 다음 예시는 'World' 를 'Python'으로 바꾼 예시이다.
>>> 'Hello, world!'.replace('world', 'Python')
'Hello, Python!'
바뀐 결과를 유지하고 싶다면 변수에 할당해주면 된다.
>>> s = 'Hello, world!'
>>> s = s.replace('world!', 'Python')
>>> s
'Hello, Python'
이번에는 문자열이 아닌 문자를 바꿔보자 translate
는 문자열 안에 문자를 다른 문자로 바꾼다.
먼저 str.maketrans('바꿀문자', '새문자')
로 변환 테이블을 만든다. 그 다음에 translate(table)
를 사용하면 문자를 바꾼뒤 결과를 반환한다.
>>> table = str.maketrans('abcde', '12345')
>>> 'ace'.translate(table)
'135'
위 예제는 'a', 'b', 'c', 'd', 'e' 문자들이 각각 '1', '2', '3', '4', '5' 로 바뀐다.
>>> 'apple, pear, grape, pineapple, orange'.split(', ')
['apple', 'pear', 'grape', 'pineapple', 'orange']
split()
를 하면 띄어쓰기 기준으로 분리된다.
split
에 대해서는 앞에서도 자주 사용했으니까 설명은 생략하겠다.
그러면 이번에는 반대로 분리된 문자열을 구분자로 연결하자
join(리스트)
는 구분자 문자열과 문자열 리스트의 요소를 연결하여 문자열로 만든다. 다음 예제는 문자열 리스트를 공백(' ')으로 연결하는 예제이다.
>>> ' '.join(['apple', 'pear', 'grape', 'pineapple', 'orange'])
'apple pear grape pineapple orange'
>>> 'python'.upper()
'PYTHON'
>>> 'PYTHON'.lower()
'python'
>>> ' Python '.lstrip()
'Python '
>>> ' Python '.rstrip()
' Python'
>>> ' Python '.strip()
' Python'
문자열을 기준으로 왼쪽이나 오른쪽 또는 양쪽에 있는 특정 문자를 삭제한다.
>>> ', python.'.lstrip(',.')
' python.'
>>> ', python.'.rstrip(',.')
', python'
>>> ', python.'.strip(',.')
' python'
string
모듈에 punctuation
에는 모든 구두점이 들어있다. 이를 활용하여 다음과 같이 strip
에 string.punctuation
을 넣으면 문자열 양쪽에 모든 구두점을 삭제할 수 있다.
>>> import string
>>> ', python.'.strip(string.punctuation)
' python'
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
만약 공백까지 삭제하고 싶다면 구두점 + '공백' 을 하면 된다.
>>> ', python.'.strip(string.punctuation + ' ')
'python'
이번에는 문자열에 공백을 넣어서 원하는 위치에 정렬해보자
ljust
는 문자열의 길이를 지정하고 왼쪽 정렬하며 남은 공간을 공백으로 채운다.
>>> 'python'.ljust(10)
'python '
>>> 'python'.rjust(10)
' python'
>>> 'python'.center(10)
' python '
만약 남은 공간이 위 예제 처럼 짝수로 딱 떨어지는 것이 아니라 홀수로 떨어진다면 공백은 왼쪽에 한 칸더 들어가게 된다. 예를 들어서 center(11)
을 한다면 왼쪽에 공백 3칸 오른쪽에 공백 2칸이 들어가게 된다.
>>> 'python'.center(11)
' python '
문자열 메서드는 처리한 결과를 반환하도록 만들어졌다. 따라서 메서드를 계속 연결해서 호출하는 메서드 체이닝이 가능하다. 메서드를 줄줄이 연결한다고 하여 메서드 체이닝(method chaining) 이라고 부른다.
>>> 'python'.rjust(10).upper()
' PYTHON'
사실 우리가 이전에 문자열을 입력 받았을 떄 사용했던 input().split()
도 메서드 체이닝이다.
지금까지는 문자열을 정렬하면서 남은 공간에 공백을 채웠다. 파이썬을 하다보면 문자열 왼쪽에 0을 채워야하는 경우가 생긴다. zfill(길이)
는 지정된 길이에 맞춰 문자열 왼쪽에 0을 채운다. 단 문자열의 길이보다 지정된 길이가 작다면 아무것도 채우지 않는다. 보통 zfill
은 숫자를 일정한 자릿수로 맞추고 앞자리는 0으로 채울 때 사용한다.
>>> '35'.zfill(4) # 숫자 앞에 0을 채움
'0035'
>>> '3.5'.zfill(6) # 숫자 앞에 0을 채움
'0003.5'
>>> 'hello'.zfill(10) # 문자열 앞에 0을 채울 수도 있음
'00000hello'
문자열에서 특정 문자열을 찾아서 인덱스를 반환한다. 만약에 특정 문자열이 없으면 -1 을 반환한다.
>>> 'apple pineapple'.find('pl')
2
>>> 'apple pineapple'.find('xy')
-1
>>> 'apple pineapple'.rfind('pl')
12
>>> 'apple pineapple'.rfind('xy')
-1
>>> 'apple pineapple'.count('pl')
2
예를 들어서 다음과 같이 학생 이름과 점수를 입력한다고 해보자.
철수의 점수는 85.3점입니다.
영희의 점수는 98.7점입니다.
위의 두 문자열에서 "의 점수는 ' . ' 점 입니다" 는 같지만 이름과 점수는 다르다. 이와 같이 문자열 내에서 특정 부분을 원하는 값으로 바꿀 때 서식 지정자 또는 포매팅을 사용한다.
서식 지정자(format specifier) 를 활용하여 문자열을 넣어보자.
'%s' % '문자열'
>>> 'I am %s.' % 'james'
'I am james.'
서식 지정자는 %
로 시작하고 자료형을 뜻하는 문자가 붙는다. %s
에서 s
는 string
으로 문자열을 뜻한다. 그 뒤에 %
를 붙이고 'james' 를 지정하면 %s
자리에 'james' 가 들어가게 된다.
여기서 주의할 점은 중간에 %
는 따음표로 묶이면 안된다는 것이다.
물론 변수로도 넣을 수 있다.
>>> name = 'maria'
>>> 'I am %s.' % name
'I am maria.'
'%d' % 숫자
>>> 'I am %d years old.' % 20
'I am 20 years old.'
%d
는 10진 정수(decimal integer)의 d 이다.
'%f' % 숫자
>>> '%f' % 2.3
'2.300000'
%f
를 사용하며 고정 소수점 fixed point의 f이다.
'%.자릿수f' % 숫자
>>> '%.2f' % 2.3
'2.30'
>>> '%.3f' % 2.3
'2.300'
자릿수도 지정할 수 있다.
%길이s
>>> '%10s' % 'python'
' python'
%
뒤에 숫자를 지정하면 그 숫자 만큼 길이의 문자열을 생성하고 오른쪽으로 정렬한 뒤에 남은 공간은 빈칸으로 채운다.
>>> '%10d' % 150
' 150'
>>> '%10d' % 15000
' 15000'
물론 %d
도 사용이 가능하다.
>>> '%10.2f' % 2.3
' 2.30'
>>> '%10.2f' % 2000.3
' 2000.30'
%f
도 사용이 가능한데 위 예제와 같이 정렬할 길이를 지정하고 소수점 이하 자릿수도 지정할 수 있다.
%-숫자s
>>> '%-10s' % 'python'
'python '
>>> 'Today is %d %s.' % (3, 'April')
'Today is 3 April.'
파이썬에서는 문자열 안에 값을 넣을 때 서식 지정자보다 더 간단한 문자열 포매팅(string formatting)을 제공한다. 문자열 포매팅은 줄괄호{} 안에 포매팅을 지정하고 format
메서드로 값을 넣는다.
{인덱스}.format(값)
>>> 'Hello, {0}'.format('world!')
'Hello, world!'
>>> 'Hello, {0}'.format(100)
'Hello, 100'
>>> 'Hello, {0} {2} {1}'.format('Python', 'Script', 3.6)
'Hello, Python 3.6 Script'
위의 예제와 같이 인덱스를 지정하면 그 인덱스에 맞는 값이 들어가게 된다. 만약 인덱스 숫자를 입력하지 않는다면 기본적으로는 format
에서 지정한 순서대로 값이 들어가게 된다.
>>> 'Hello, {} {} {}'.format('Python', 'Script', 3.6)
'Hello, Python Script 3.6'
{ } 에 인덱스인 숫자로 지정하니까 알아보기가 조금 불편하다. 이럴땐 이름을 지정하면 된다.
>>> 'Hello, {language} {version}'.format(language='Python', version=3.6)
'Hello, Python 3.6'
위와 같이 인덱스 대신 이름을 지정하고 format
에서 이름에 해당 값을 입력해주면 된다.
>>> language = 'Python'
>>> version = 3.6
>>> f'Hello, {language} {version}'
'Hello, Python 3.6'
파이썬 3.6 부터는 더 간단한 방법으로 {변수} 를 하여 값을 넣을 수 있다. 문자열 앞에는 포매팅(formatting)이라는 뜻으로 f
를 붙인다.
>>> '{{ {0} }}'.format('Python')
'{ Python }'
중괄호 자체를 출력하려면 {{ }}
처럼 중괄호를 두 번 사용하면 된다.
지금까지는 문자열을 정렬할 때 서식 지정자나 ljust
, rjust
, cente
로 정렬했었다. 문자열 포매팅에서도 문자열을 정렬할 수 있다.
{인덱스 :<길이}.format(값)
>>> '{0:<10}'.format('python')
'python '
부등호가 왼쪽 방향(<) 을 가리키고 있고 그 뒤에 숫자 10 이 들어왔다. 그러면 길이를 10 만큼 만든 뒤에 왼쪽 정렬하게 되고 나머지 공간은 빈칸으로 채우게 된다.
>>> '{0:>10}'.format('python')
' python'
비슷한 방법으로 오른쪽 정렬은 위와 같이 하면 된다.
>>> '{:>10}'.format('python')
' python'
참고로 인덱스를 사용하지 않는다면 위와 같이 해도 된다.
이번에는 숫자 앞에 0을 넣어서 길이를 맞추는 방법에 대해서 알아보자
"%0개수" % 숫자
"{0:03d}.format(숫자)"
>>> '%03d' % 1
'001'
>>> '{0:03d}'.format(35)
'035'
%d
대신 %03d
와 같이 %
와 d
사이에 0과 숫자를 넣어주면 자릿수에 맞춰 앞에 0이 들어가게 된다.
또는 { } 를 사용하여 인덱스나 이름 뒤에 콜론뒤에 03d
와 같이 0과 숫자의 개수를 지정하면 된다.
그렇다면 실수는 어떻게 표현할까? 정수랑 크게 다를게 없다.
>>> '%08.2f' % 3.6
'00003.60'
>>> '{0:08.2f}'.format(150.37)
'00150.37'
>>> '{0:0<10}'.format(15) # 길이 10, 왼쪽으로 정렬하고 남는 공간은 0으로 채움
'1500000000'
>>> '{0:0>10}'.format(15) # 길이 10, 오른쪽으로 정렬하고 남는 공간은 0으로 채움
'0000000015'
>>> '{0: >10}'.format(15) # 남는 공간을 공백으로 채움
' 15'
>>> '{0:>10}'.format(15) # 채우기 부분을 생략하면 공백이 들어감
' 15'
>>> '{0:x>10}'.format(15) # 남는 공간을 문자 x로 채움
'xxxxxxxx15'
format(숫자, ',')
>>> format(1493500, ',')
'1,493,500'
>>> '%20s' % format(1493500, ',') # 길이 20, 오른쪽으로 정렬
' 1,493,500'
>>> '{0:,}'.format(1493500)
'1,493,500'
>>> '{0:>20,}'.format(1493500) # 길이 20, 오른쪽으로 정렬
' 1,493,500'
>>> '{0:0>20,}'.format(1493500) # 길이 20, 오른쪽으로 정렬하고 남는 공간은 0으로 채움
'000000000001,493,500'