본문 바로가기
Tips/Python

[Py린이를 위한 Python 기초] 7. 문자열 응용

by 엘사박 2023. 3. 2.

※ 이 글은 책 「파이썬 코딩도장」의 내용을 재정리한 내용임

- 파이썬 시리즈 글 순서->  링크

 

 

 

1) 문자열 다시 정리

● 문자열(String)이란?

- 문자 단어 등으로 구성된 문자들의 집합을 의미

- 'Hello World!', 'a', '123' 등을 문자열이라고 함

- 문자열은 리스트, 튜플과 마찬가지로 시퀀스 객체이며 시퀀스 객체에 쓸 수 있는 메소드를 사용할 수 있음

 

● 시퀀스 자료형에 쓸 수 있는 것들( 3장 中)

-특정값 있는지 확인하기:  in 시퀀스

-특정값 없는지 확인하기:  not in 시퀀스

-시퀀스 연결하기: 시퀀스1 + 시퀀스2 (range는 불가)

-시퀀스 반복: 시퀀스1 * 정수 (range는 불가)

-시퀀스 인덱스: 시퀀스[인덱스]       (0부터 시작)(-1=뒤에서 첫째)

-시퀀스 슬라이스: 시퀀스[시작인덱스:끝인덱스+1:증가폭]

-시퀀스 슬라이스 요소 할당:

시퀀스[시작인덱스:끝인덱스+1:증가폭] = [요소1, 요소2,...]

 

- 이제 문자열에 쓸 수 있는 메소드를 알아보자

 

2) 문자열 메소드

 

  메소드 설명 예시
연결 '기호'.join([문자열]) 문자열 리스트 요소를 '기호' 로 연결하여 하나의 문자열로 반환 a = ['사과', '레몬', '배']
s = '-'.join(a)
print(s)

# '사과-레몬-배'
분리 '문자열'.split() 문자열 분리하여 리스트로 반환 s = '사과-레몬-배'
a = s.split('-')
print(a)

# ['사과', '레몬', '배']
삭제 '   문자열   '.lstrip() 왼쪽 공백 삭제 s = '     apple     '
l = s.lstrip()
print(l)

# 'apple     '
'   문자열   '.rstrip() 오른쪽 공백 삭제 s = '     apple     '
r = s.rstrip()
print(r)

# '     apple'
'   문자열   '.strip() 양쪽 공백 삭제 s = '     apple     '
o = s.strip()
print(o)

# 'apple'
'문자열'.lstrip('삭제할 문자들') 왼쪽 특정 문자 삭제 a = ', python.'
s = a.lstrip(',.')
print(s)

# ' python'
'문자열'.rstrip('삭제할 문자들') 오른쪽 특정 문자 삭제 a = ',python.'
s = a.rstrip(',.')
print(s)

# ', python'
'문자열'.strip('삭제할 문자들') 양쪽 특정 문자 삭제 a = ',python.'
s = a.strip(',.')
print(s)

# ' python'
'문자열'.strip(string.punctuation) 모든 구두점 삭제
!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~
import string
a = ', python. '
s = a.strip(string.punctuation)
print(s)

# ' python'
교체 replace('바꿀 문자열', '새 문자열') 특정 문자열을 다른 문자열로 대체함 s = "Hello World!"
s = s.replace("world", "python")
print(s)

# Hello python!
변환테이블 =str.maketrans('바꿀문자', '새 문자')
'문자열'.translate(변환테이블)
- 변환테이블: 어떤 문자를 뭘로 대체할지 지정

- 특정 문자를 모두 찾아 다른 문자로 전환
s = "Hello World!"

t = str.maketrans('eo', '12')
s.translate(t)
print(s)

# H1ll2 W2rld!
정렬 ljust(길이) 문자열을 지정된 길이로 만든 뒤 왼쪽 정렬하여 남는 공간을 공백으로 채움 a = 'python'
s = a.ljust(10)
print(s)

# 'python    '
rjust(길이) 문자열을 지정된 길이로 만든 뒤 오른쪽 정렬하여 남는 공간을 공백으로 채움 a = 'python'
s = a.rjust(10)
print(s)

# '    python'
center(길이) 문자열의 길이를 지정된 길이로 만든 뒤 가운데 정렬하고 양옆 공간을 공백으로 채움(남는 공간 홀수라면 왼쪽 공백이 한칸 더 들어감) a = 'python'
s = a.center(10)
print(s)

# '  python  '
zfill(길이) 지정된 길이에 맞춰 문자열 왼쪽에 0을 채움(문자열길이>지정된 길이 라면 아무것도 채우지 않음) a = 'python'
s = a.zfill(10)
print(s)

# '0000python'
검색 find(찾을문자열) - 왼쪽에서부터 문자열 찾아 인덱스 반환, 문자열 없으면 -1 반환

- 같은 문자가 여러개일 경우 처음 찾은 문자열 인덱스 반환
a = 'apple pinapple'
s = a.find('pl')
print(s)

# 2
rfind(찾을문자열) - 오른쪽에서부터 문자열 찾아 인덱스 반환, 문자열 없으면 -1 반환

- 같은 문자가 여러개일 경우 처음 찾은 문자열 인덱스 반환
a = 'apple pinapple'
s = a.find('pl')
print(s)

# 12
index(찾을문자열) 왼쪽에서부터 문자열 찾아 인덱스 반환, 문자열 없으면 에러 발생

- 같은 문자가 여러개일 경우 처음 찾은 문자열 인덱스 반환
a = 'apple pinapple'
s = a.index('pl')
print(s)

# 2
rindex(찾을문자열) 오른쪽에서부터 문자열 찾아 인덱스 반환, 문자열 없으면 에러 발생

- 같은 문자가 여러개일 경우 처음 찾은 문자열 인덱스 반환
a = 'apple pinapple'
s = a.rindex('pl')
print(s)

# 12
개수 count(개수셀문자열) 현재 문자열에서 특정문자열의 개수를 세어 반환 a = 'apple pinapple'
s = a.count('pl')
print(s)

# 2

 

3) 문자열 서식지정자

● 서식지정자(format specifier)란?

a = 1.0252864

print('철수는',a,'살이다.')

# 철수는 1.0252864살이다.

- 위의 코드에서 a를 출력하고 싶어서 print()를 쓸 때는 쉼표로 연결을 해야했다

- 게다가 소수 둘째자리까지만 출력하고 싶은데 a라는 변수에 할당된 값이 복잡한 계산과정을 걸쳐 나왔기 때문에 실수로 나왔다고 가정해보자 

- a값에 대한 변화없이 출력만 깔끔하게 할 방법은 없을까?

- 출력 식을 쓸 때 좀 더 간단하게 쓸 방법은 없을까?

- 그래서 나온 것이 '서식 지정자'이다

 

● 서식 지정자 종류

- 역시나 표로 정리해보자

    방법 설명 예시
문자열 '%s' % '문자열' %s 자리에 문자열을 넣어 출력 a = ' I am %s.' % 'james'
print(a)

# I am james.
'%길이s' % '문자열' 문자열을 지정된 길이로 만든뒤 오른쪽 정렬하고 남은 공간 공백으로 채움 a = '%10s' % 'python'
print(a)

# '    python'
'%-길이s' % '문자열' 문자열을 지정된 길이로 만든뒤 왼쪽 정렬하고 남은 공간 공백으로 채움 a = '%-10s' % 'python'
print(a)

# 'python    '
숫자 정수 '%d' % 숫자 %d 자리에 숫자를 넣어 출력(d =  10진 정수를 의미) a = ' I am %d years old' % 20
print(a)

# I am 20 years old
'%자릿수d' % 숫자  숫자를 지정된 길이로 만들고 오른쪽 정렬하여 남은공간 공백으로 채움 a = '%10d' % 200
print(a)

# '       200'
'%0길이d' % 숫자 숫자를 지정된 길이로 만들고 오른쪽 정렬하여 남은공간 0으로 채움 a = '%010d' % 200
print(a)

# '0000000200'
실수 '%f' % 숫자 %f 자리에 숫자를 넣어 출력
(f = 고정 소수점을 의미)
(기본적으로 소수점 이하 6자리까지 표시
a = '무게는 %f kg이다' % 3
print(a)

# 무게는 3.000000kg이다
'%. 자릿수f' % 숫자 %f 자리에 숫자를 넣어 출력
(자릿수까지만 출력)
a = '무게는 %. 2f kg이다' % 3
print(a)

# 무게는 3.00kg이다
'%길이. 자릿수f' % 숫자 지정된 자리만큼 잘라서 지정된 길이만큼 만들고 남은 공간 공백으로 채워 출력 a = '%10.2f' % 2.3
print(a)

# '       2.30'
'%0개수. 자릿수f' % 숫자 지정된 자리만큼 잘라서 지정된 길이만큼 만들고 남은 공간 0으로 채워 출력 a = '%010.2f' % 2.3
print(a)

# '0000002.30'
숫자 문자 함께 '%d %s' % (숫자, '문자열') 괄호 안에 값을 콤마로 구분해서 넣음, 서식지정자 개수= 값개수이어야함 a = '오늘은 %d %s.' % (3, 'April')
print(a)

# '오늘은 3 April.'

 

 

4) format 메서드

 

● format 메서드란?

- 서식지정자보다 더 간단한 문자열 포매팅 방식

- { }안에 포매팅 지정 후 값을 넣음

- 기본형태

'{인덱스}'.format(값)

 

- 코드 봅시다

a = 'Hello'
b = 'world!'
print('{0} {1}'.format(a, b))

# Hello world!

- 이때 인덱스 순서를 바꾼다면?

a = 'Hello'
b = 'world!'
print('{1} {0}'.format(a, b))

# world! Hello

- 출력순서도 바뀐다. 그렇다면 인덱스를 적지 않으면?

a = '내 나이는'
b = 30
print('{kor} {age}'.format(kor = a, age = b))

# 내 나이는 30

- 지정한 순서대로 값이 들어감

- 인덱스 대신 이름 지정도 가능함

 

★ f-string 

- 이건 앞의 포맷팅 방식보다 더 간단한 문법이다

- 기본형태

f'문자열 {변수}'

- 예시를 보자

a = '내 나이는'
b = 30

print(f'{a} {b}')

# 내 나이는 30

 

● 문자열 정렬하기

- 앞에서 서식 지정자나 함수(ljust, rjust, center)로 문자열을 정렬하였다

- format 메서드로도 문자열 정렬이 가능하다

- 기본 형태

'{인덱스:<길이}'.format(값)

'{인덱스:>길이}'.format(값)

- 예시 고!

a = '{0:<10}'.format('python') #왼쪽정렬
b = '{0:>10}'.format('python') #오른쪽정렬

print(a)
print(b)

# 'python    '
# '    python'

 

● 숫자 개수 맞추기

- 001, 002, ...035와 같은 식으로 숫자를 출력하고 싶을 땐 이렇게 하자

- 기본형태

'{인덱스:0개수d}'.format(숫자)
'{인덱스:0개수.자릿수f}'.format(숫자)

 

- 예시봅시다

'{0:03d}'.format(35)
# '035'

'{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:0>10.2f}'.format(15)    # 길이 10, 오른쪽으로 정렬하고 소수점 자릿수는 2자리
# '0000015.00'

'{0: >10}'.format(15)    # 남는 공간을 공백으로 채움
# '        15'

'{0:x>10}'.format(15)    # 남는 공간을 문자 x로 채움
# 'xxxxxxxx15'

 

● 금액 천단위 콤마 넣기

- 1000000을 1,000,000으로 출력하려면 어떻게 해야할까?

- 기본형태 => format(숫자, ',')

- 응용(1) => 서식지정자와 함께 사용

'%20s' % format(1493500, ',')    # 길이 20, 오른쪽으로 정렬
# '           1,493,500'

 - 응용(2) => 포매팅에서 사용(자릿수 뒤에 콤마)

'{0:0>10,.2f}'.format(1500)
# '001,500.00'

 

 

 

마무리 정리

 

- '{0:0>10,.2f}'.format(1500)을 해석하면

- '{0:0>10,.2f}'.format(1500) format 괄호안의 값에 대해

- '{0:0>10,.2f}'.format(1500) 0번째 값을 가져와서

- '{0:0>10,.2f}'.format(1500) 소수 둘째자리까지 표시

- '{0:0>10,.2f}'.format(1500) 콤마로 백자리씩 구분

- '{0:0>10,.2f}'.format(1500) 10자가 들어갈 공간을 만듦

- '{0:0>10,.2f}'.format(1500) 오른쪽 정렬하고

- '{0:0>10,.2f}'.format(1500) 만들어진 공간 중 빈 공간을 0으로 채움

이라는 뜻임!

 

- 이해가 된다면 이 장을 넘어가도 좋다

댓글