-
chapter02-2 문자열 자료형(문자열 포매팅, 문자열 관련함수)점프 투 파이썬 2021. 9. 6. 16:43
Chapter 2-2¶
문자열 포매팅¶
문자열에서 또하나 알아야 할 것으로는 문자열 포매팅이 있다. 이것을 공부하기 전에 다음과 같은 문자열을 출력하는 프로그램을 작성했다고 가정해 보자.
"현재 온도는 18도 입니다"¶
시간이 지나서 20도가 되면 문장을 출력한다.
"현재 온도는 20도 입니다"¶
위 두 문자열은 모두 같은데 20이라는 숫자와 18이라는 숫자만 다르다. 이렇게 문자열 안의 특정한 값을 바꿔야 할 경우가 있을 때 이것을 가능하게 해주는 것이 바로 문자열 포매팅 기법이다.
쉽게 말해 문자열 포매팅이란 문자열 안에 어떤 값을 삽입하는 방법이다. 다음 예를 직접 실행해 보면서 그 사용법을 알아보자.In [1]:"I eat %d apples."%3
Out[1]:'I eat 3 apples.'
위 예제의 결괏값을 보면 알겠지만 위 예제는 문자열 안에 정수 3을 삽입하는 방법을 보여 준다. 문자열 안에서 숫자를 넣고 싶은 자리에 %d 문자를 넣어주고, 삽입할 숫자 3은 가장 뒤에 있는% 문자 다음에 써 넣었다. 여기에서 %d는 문자열 포맷 코드라고 부른다.
2. 문자열 바로 대입¶
문자열 안에 꼭 숫자만 넣으라는 법은 없다. 이번에는 숫자 대신 문자열을 넣어 보자.
In [2]:"I eat %s apples."%"five"
Out[2]:'I eat five apples.'
위 예제에서는 문자열 안에 또 다른 문자열을 삽입하기 위해 앞에서 사용한 문자열 포맷 코드%d가 아닌 %s를 썻다. 어쩌면 눈치 빠른 독자는 벌써 유추하였을 것이다. 숫자를 넣기 위해서는 %d를 써야 하고, 문자열을 넣게 위해서는 %s를 써야 한다는 사실을 말이다.
3. 숫자 값을 나타내는 변수로 대입¶
In [3]:number=3 "I eat %d apples."%number
Out[3]:'I eat 3 apples.'
1번처럼 숫자를 바로 대입하나 위 예제처럼 숫자 값을 나타내는 변수를 대입하나 결과는 같다.
4. 2개이상의 값 넣기¶
그렇다면 문자열 안에 1개가 아닌 여러 개의 값을 넣고 싶을 땐 어떻게 해야 할까?
In [5]:numder=10 day="three" "I ate %d apples. so I was sick for %s days."%(number, day)
Out[5]:'I ate 3 apples. so I was sick for three days.'
위 예문처럼 2개 이상의 값을 넣으려면 마지막 % 다음 괄호 안에 콤마(,)로 구분하여 각각의 값을 넣어 주면 된다.
문자열 포맷 코드¶
문자열 포매팅 예제에서는 대입해 넣는 자료형으로 정수와 문자열을 사용했으니 이 외에도 다양한 것을 대입할수 있다.
문자열 포맷 코드로는 다음과 같은 것이 있다.
코드 설명
%s 문자열
%c 문자1개
%d 정수
%f 부동소수
%o 8진수
%x 16진수
%% Literal%(문자'%'자체)여기에서 재미있는 것은 %s 포맷 코드인데, 이 코드는 어떤 형태의 값이든 변환해 넣을 수 있다.
무슨말인지 예를통해 확인해 보자.In [6]:"I have %s apples"%3
Out[6]:'I have 3 apples'
In [8]:"rate is %s"%3.234
Out[8]:'rate is 3.234'
3을 문자열 안에 삽입하려면 %d를 사용 하고, 3.234를 삽입하려면 %f를 사용해야 한다. 하지만%s를 사용하면 이런 것을 생각하지 않아도 된다. 왜냐하면 %s는 자동으로 % 뒤에 있는 값을 문자열로 바꾸기 때문이다.
포매팅 연사자 %d와 %를 같이 쓸 떄는 %%를 쓴다.¶
In [5]:"Error is %d%."%98
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-5-b890024f1b57> in <module> ----> 1 "Error is %d%."%98 ValueError: incomplete format
위 예문의 결괏값으로 당연히 "Error is 98%" 가 출력될 것이라고 예상하겠지만 파이썬은 값이 올바르지 않다는 값 오류 메시지를 보여준다.
이유는 문자열 포맷 코드인%d와 %가 같은 문자열 안에 존재하는 경우, %를 나타내려면 반드시 %%로써야 하는 법칙이 있기 때문이다. 이 점은 꼭 기억해 두어야 한다. 하지만 문자열 안에%d 같은 포매팅 연사자가 없으면 %는 홀로 쓰여도 상관이 없다 따라서 위 예를 제대로 실행하려면 다음과 같이 해야 한다.
In [4]:"Error is %d%%."%98
Out[4]:'Error is 98%.'
포맷 코드와 숫자 함께 사용하기¶
위에서 보았듯이 %d, %s 등의 포맷 코드는 문자열 안에 어떤 값을 삽입하기 위해 사용한다. 하지만 포맷 코드를 숫자와 함께 사용하면 더 유용하게 사용할 수 있다.
다음 예를 보고 따라해 보자.1. 정렬과 공백¶
In [6]:"%10s"%"hi"
Out[6]:' hi'
앞의 예문에서 %10s는 전체 길이가 10개인 문자열 공간에서 대입되는 값을 오른쪽으로 정렬하고 그 앞에 나머지는 공백으로 남겨 두라는 의미이다.
In [8]:"%-10sjane"%'hi'
Out[8]:'hi jane'
hi를 왼쪽으로 정렬하고 나머지는 공백으로 채웠음을 볼 수 있다.
2. 소수점 표현하기¶
In [11]:"%0.4f"%3.42134234
Out[11]:'3.4213'
3.42134234를 소수점 네 번째 자리까지만 나타내고 싶을 경우에는 위와 같이 사용한다. 즉 여기서'.'의 의미는 소수점 포인트를 말하고 그 뒤의 숫자 4는 소수점 뒤에 나올 숫자의 개수를 말한다.
다음 예를 살펴보자.In [12]:"%10.4f"%3.42134234
Out[12]:' 3.4213'
위 예는 숫자 3.42134234를 소수점 네 번째 자리까지만 표시하고 전체 길이가 10개인 문자 열 공간에서 오른쪽으로 정렬하는 예를 보여준다.
format 함수를 사용한 포매팅¶
문자열의 format 함수를 사용하면 좀 더 발전된 스타일로 문자열 포맷을 지정할 수 있다. 앞에서 살펴본 문자열 포매팅 예제를 format 함수를 사용해서 바꾸면 다음과 같다.
숫자 바로 대입하기¶
In [13]:"I eat {0}apples".format(3)
Out[13]:'I eat 3apples'
"I eat {0}apples".문자열 중 {0} 부분이 숫자 3으로 바뀌었다.
문자열 바로 대입하기¶
In [15]:"I eat {0} apples". format("five")
Out[15]:'I eat five apples'
문자열의 {0} 항목이 five라는 문자열로 바뀌었다.
숫자 값을 가진 변수로 대입하기¶
In [17]:number=3 "I eat {0} apples".format(number)
Out[17]:'I eat 3 apples'
문자열의 {0}항목이 number 변수 값인 3으로 바뀌었다.
2개이상의 값 넣기¶
In [21]:number=10 day="three" "I ate {0} apples.so I was sick for {1} days.".format(number, day)
Out[21]:'I ate 10 apples.so I was sick for three days.'
2개 이상의 값을 넣을 경우 문자열의 {0},{1}과 같은 인덱스 항목이 format 함수의 입력값으로 순서에 맞게 바뀐다. 즉 위 예에서 {0}은 format 함수의 첫 번째 입력값인 number로 바뀌고 {1}은 format 함수의 두 번째 입력값인 day로 바뀐다.
이름으로 넣기¶
In [25]:"I ate {number}applrs. so I was sick for {day} days".format(number=10, day=3)
Out[25]:'I ate 10applrs. so I was sick for 3 days'
위 예에서 볼 수 있듯이 {0},{1}과 같은 인덱스 항복 대신 더 편리한 {name} 형태를 사용하는 방법도 있다. {name} 형태를 사용할 경우 format 삼수에는 반드시 name=value와 같은 형태의 입력값이 있어야만 한다. 위 예는 문자열의 {number}, {day}가 format 함수의 입력값인 number=10m day=3 값으로 각각 바뀌는 것을 보여 주고 있다.
인덱스와 이름을 혼용해서 넣기¶
In [28]:"I ate {0} apples. so I was sick for {day} days.".format(10, day=3)
Out[28]:'I ate 10 apples. so I was sick for 3 days.'
위와 같이 인덱스 항목과 name=value 형태를 혼용하는 것도 가능하다.
왼쪽 정렬¶
In [29]:"{0:<10}".format("hi")
Out[29]:'hi '
:<10 표현식을 사용하면 치환되는 문자열을 왼쪽으로 정렬하고 문자열의 총 자릿수를 10으로 맞출 수 있다.
오른쪽 정렬¶
In [30]:"{0:>10}".format("hi")
Out[30]:' hi'
오른쪽 정렬은 :<대신:>을 사용하면 된다. 화살표 방향을 생각하면 어느 쪽으로 정렬되는지 바로 알 수 있을 것이다.
가운데 정렬¶
In [31]:"{0:^10}".format("hi")
Out[31]:' hi '
:^기호를 사용하면 가운데 정렬도 가능하다.
공백 채우기¶
In [33]:"{0:=^10}".format("hi")
Out[33]:'====hi===='
In [34]:"{0:!<10}".format("hi")
Out[34]:'hi!!!!!!!!'
정렬할 때 공백 문자 대신에 지정한 문자 값으로 채워 넣는 것도 가능하다. 채워 넣을 문자 값은 정렬 문자 <,>,^ 바로 앞에 넣어야 한다. 위 예에서 첫 번째 예제는 가운데(^)로 정렬하고 빈 공간을 = 문자로 채웠고, 두 번째 예제는 왼쪽(<)으로 정렬하고 빈 공간을 ! 문자로 채웠다.
소수점 표현하기¶
In [35]:y=3.42134234 "{0:0.4f}".format(y)
Out[35]:'3.4213'
위 예는 format 함수를 사용해 소수점을 4자리까지만 표현하는 방법을 보여 준다. 앞에서 살펴보았던 표현식 0.4f를 그대로 사용한 것을 알 수 있다.
In [37]:"{0:10.4f}".format(y)
Out[37]:' 3.4213'
위와 같이 자릿수를 10으로 맞출 수도 있다. 역시 앞에서 살펴본 10.4f의 표현식을 그대로 사용한 것을 알 수 있다.
In [39]:"{{and}}".format()
Out[39]:'{and}'
format 함수를 사용해 문자열 포매팅을 할 경우 {}와 같은 중괄호 문자를 포매팅 문자각 아닌 문자 그대로 사용하고 싶은 경우에는 위 예의 {{ }}처럼 2개를 연속해서 사용하면 된다.
f 문자열 포매팅¶
파이썬 3.6버전부터는 f 문자열 포매팅 기능을 사용할 수 있다. 파이썬3.6 미만 버전에서는 사용할 수 없는 기능이므로 주의 해야한다.
다음과 같이 문자열 앞에 f 접두사를 붙이면 f 문자열 포매팅 기능을 사용할 수 있다.In [41]:name='홍길동' age=30 f'나의 이름은 {name}입니다. 나이는 {age}입니다.'
Out[41]:'나의 이름은 홍길동입니다. 나이는 30입니다.'
f 문자열 포매팅은 위와 같이 name, age와 같은 변수 값을 생성한 후에 그 값을 참조할 수 있다. 또한 f 문자열 포매팅은 표현식을 지원하기 떄문에 다음과 같은 것도 가능하다.
In [1]:age=30 f'나는 내년이면 {age+1}살이 된다.'
Out[1]:'나는 내년이면 31살이 된다.'
딕셔너리는 f 문자열 포매팅에서 다음과 같이 사용 할 수 있다.
In [6]:d={'name':'홍길동','age':30} f'나의 이름은{d["name"]}입니다. 나이는{d["age"]}입니다.'
Out[6]:'나의 이름은홍길동입니다. 나이는30입니다.'
정렬은 다음과 같이 할 수 있다.
In [7]:f'{"hi":<10}'
Out[7]:'hi '
In [9]:f'{"hi":>10}'
Out[9]:' hi'
In [11]:f'{"hi":^10}'
Out[11]:' hi '
공백 채우기는 다음과 같이 할수있다.
In [12]:f'{"hi":=^10}'
Out[12]:'====hi===='
In [14]:f'{"hi":!^10}'
Out[14]:'!!!!hi!!!!'
소수점은 다음과 같이 표현할 수 있다.
In [16]:y=3.42134234 f'{y:0.4f}'
Out[16]:'3.4213'
In [17]:f'{y:10.4f}'
Out[17]:' 3.4213'
f문자열에서 {} 문자를 표시하려면 다음과 같이 두개를 동시에 사용해야 한다.
In [18]:f'{{and}}'
Out[18]:'{and}'
format 함수 또는 f 문자열 포매팅을 사용해 '!!!python!!!' 문자열을 출력해 보자
In [20]:f'{"python":!^12}'
Out[20]:'!!!python!!!'
In [22]:"{0:!^12}".format('python')
Out[22]:'!!!python!!!'
지금까지는 문자열을 가지고 할 수 있는 기본적인 것에 대해 알아보았다. 이제부터는 문자열을 좀 더 자유자재로 다루기 위해 공부해야 할 것을 설명할 것이다. 지쳤다면 잠시 책을 접고 휴식을 취하자.
문자열 관련 함수¶
문자열 자료형은 자체적으로 함수를 가지고 있다. 이들 함수를 다른 말로 문자열 내장 함수라 한다. 이 내장 함수를 사용하려면 문자열 변수 이름 뒤에 "."를 붙인 다음에 함수 이름을 써주면 된다.
이제 문자열의 내장 함수에 대해서 알아보자.In [24]:a="hobby" a.count('b')
Out[24]:2
문자열 중 문자 b의 개수를 돌려준다.
위치 알려주기 1(find)¶
In [25]:a="Python is the best choice" a.find('b')
Out[25]:14
In [26]:a.find('k')
Out[26]:-1
문자열 중 문자 b.가 처음으로 나온 위치를 반환한다. 만약 찾는 문자나 문자열이 존재하지 않는다면 -1을 반환판다.
위치 알려주기2(index)¶
In [27]:a="Life is too short" a.index('t')
Out[27]:8
In [28]:a.index('k')
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-28-cb6c8ec35229> in <module> ----> 1 a.index('k') ValueError: substring not found
문자열 중 문자 t가 맨 처음으로 나온 위치를 반환한다. 만약 찾는 문자나 문자열이 존재하지 않는다면 오류를 발생시킨다. 앞의 find 함수와 다른 점은 문자열 안에 존재하기 않는 문자를 찾으면 오류가 발생한다는 점이다.
문자열 삽입(join)¶
In [29]:",".join('abcd')
Out[29]:'a,b,c,d'
abcd 문자열의 각각의 문자 사이에 ','를 삽입한다 join 함수는 문자열뿐만 아니라 앞으로 배울 리스트나 튜플도 입력으로 사용할 수 있다. join 함수의 입력으로 리스트를 사용하는 예는 다음과 같다.
In [32]:",".join(['a','b','c','d'])
Out[32]:'a,b,c,d'
소문자를 대문자로 바꾸기(upper)¶
In [34]:a="hi" a.upper()
Out[34]:'HI'
upper 함수는 소문자를 대문자로 바꾸어 준다. 만약 문자열이 이미 대문자라면 아무 변화도 일어나지 않을 것이다.
대문자를 소문자로 바꾸기(lower)¶
In [36]:a="HI" a.lower()
Out[36]:'hi'
lower 함수는 대문자를 소문자로 바꾸어 준다.
왼쪽 공백 지우기(lstrip)¶
In [39]:a=" hi " a.lstrip()
Out[39]:'hi '
문자열 중 가장 왼쪽에 있는 한 칸 이상의 연속된 공백들을 모두 지운다. lstrip에서 l은 left를 의미한다.
오른쪽 공백지우기(rstrip)¶
In [41]:a=" hi " a.rstrip()
Out[41]:' hi'
문자열 중 가장 오른쪽에 있는 한 칸 이상의 연속된 공백을 모두 지운다. rstrip에서 r은 right를 의미한다.
양쪽 공백 지우기(strip)¶
In [42]:a=" hi " a.strip()
Out[42]:'hi'
문자열 양쪽에 있는 한 칸 이상의 연속된 공백을 모두 지운다.
문자열 바꾸기(replace)¶
In [44]:a="Life is too short" a.replace("Life","Your leg")
Out[44]:'Your leg is too short'
replace(바뀌게 될 문자열, 바꿀 문자열)처럼 사용해서 문자열 안의 특정한 값을 다른 값으로 치환해준다.
문자열 나누기(split)¶
In [46]:a="Life is too short" a.split()
Out[46]:['Life', 'is', 'too', 'short']
In [47]:b="a:b:c:d" b.split(':')
Out[47]:['a', 'b', 'c', 'd']
splt 함수는 a.split() 처럼 괄호 안에 아무 값도 넣어 주지 않으면 공백(스페이스, 탭, 엔터 등)을 기준으로 문자열을 나누어 준다. 만약 b.split(':')처럼 괄호 안에 특정 값이 있을 경우에는 괄호 안의 값을 구분자로 해서 문자열을 나누어 준다. 이렇게 나눈 값은 리스트에 하나씩 들어가게 된다. ['Life', 'is', 'too', 'short']나 ['a', 'b', 'c', 'd']가 리스트인데 02-3에서 자세히 알아볼 것이니 여기에서는 너무 신경 쓰지 않아도 된다.
위에서 소개한 문자열 관련 함수는 문자열 처리에서 사용 빈도가 매우 높고 유용하다. 이 외에도 몇 가지가 더있지만 자주 사용되지 않는다.출처 : "점프투파이썬"
'점프 투 파이썬' 카테고리의 다른 글
chapter02-4 튜플 자료형 (0) 2021.09.07 chapter02-3 리스트 자료형 (0) 2021.09.06 chapter02-2 문자열 자료형(문자열 인덱싱과 슬라이싱) (0) 2021.09.04 chapter02-2 문자열 자료형(문자열 연산하기) (0) 2021.09.04 chapter02-2 문자열 자료형 (0) 2021.09.04