코딩도장_Unit 24. 문자열 응용하기

김민주·2022년 1월 1일
0

AIFFEL_풀잎스쿨

목록 보기
20/23
post-thumbnail

문자열도 시퀀스 자료형이라 리스트와 비슷한 점이 많다.

24.1 문자열 조작하기

  • 파이썬은 문자열을 조작하거나 정보를 얻는 다양한 메서드(method) 제공

1. 문자열 바꾸기

  • replace('바꿀문자열', '새문자열')

    • 문자열 안의 문자열을 다른 문자열로 바꾼다.(문자열 자체는 변경하지 않으며 바뀐 결과를 반환)
    • 만약 바뀐 결과를 유지하고 싶다면 문자열이 저장된 변수에 replace를 사용한 뒤 다시 변수에 할당해준다.
# 다른 문자열로 바꾸기
>>> 'Hello, world!'.replace('world', 'Python')
'Hello, Python!'

# 바뀐 결과값 유지
>>> s = 'Hello, world!'
>>> s = s.replace('world!', 'Python')
>>> s
'Hello, Python'

2. 문자 바꾸기

  • translate

    • 문자열 안의 문자를 다른 문자로 바꾼다.
    • 먼저 str.maketrans('바꿀문자', '새문자')로 변환 테이블을 만든 후 translate(테이블) 사용
>>> table = str.maketrans('aeiou', '12345')
>>> 'apple'.translate(table)
'1ppl2

3. 문자열 분리하기

  • split()

    • 공백을 기준으로 문자열을 분리하여 리스트로 만든다.
    • split('기준문자열') : 기준 문자열로 문자열 분리
>>> 'apple pear grape pineapple orange'.split()
['apple', 'pear', 'grape', 'pineapple', 'orange']

# 콤마(,)로 문자열 분리
>>> 'apple, pear, grape, pineapple, orange'.split(', ')
['apple', 'pear', 'grape', 'pineapple', 'orange']

4. 구분자 문자열과 문자열 리스트 연결하기

  • join(리스트)

    • 구분자 문자열과 문자열 리스트의 요소를 연결하여 문자열로 만든다.
# 각 문자열 사이에 공백
>>> ' '.join(['apple', 'pear', 'grape', 'pineapple', 'orange'])
'apple pear grape pineapple orange'

# 각 문자역 사이에 -
>>> '-'.join(['apple', 'pear', 'grape', 'pineapple', 'orange'])
'apple-pear-grape-pineapple-orange'

5. 소문자를 대문자로 바꾸기

  • upper()

    • 문자열의 문자를 모두 대문자로 바꾼다.
    • 만약 문자열 안에 대문자가 있다면 그대로 유지
>>> 'python'.upper()
'PYTHON'

6. 대문자를 소문자로 바꾸기

  • lower()

    • 문자열의 문자를 모두 소문자로 바꾼다.
    • 만약 문자열 안에 소문자가 있다면 그대로 유지
>>> 'PYTHON'.lower()
'python'

7. 왼쪽 공백 삭제하기

  • lstrip()

    • 문자열에서 왼쪽에 있는 연속된 모든 공백 삭제
      (l은 왼쪽(left)을 의미)
>>> '   Python   '.lstrip()
'Python   '

8. 오른쪽 공백 삭제하기

  • rstrip()

    • 문자열에서 오른쪽에 있는 연속된 모든 공백 삭제
      (r은 오른쪽(right)을 의미)
>>> '   Python   '.rstrip()
'   Python'

9. 양쪽 공백 삭제하기

  • strip()

    • 문자열에서 양쪽에 있는 연속된 모든 공백 삭제
>>> '   Python   '.strip()
'Python'

10. 왼쪽의 특정 문자 삭제하기

  • lstrip('삭제할문자들')

    • 삭제할 문자들을 문자열 형태로 넣으면 문자열 왼쪽에 있는 해당 문자 삭제
>>> ', python.'.lstrip(',.')  # 공백은 넣지 않았으므로 그대로 둔다.
' python.'

11. 오른쪽의 특정 문자 삭제하기

  • rstrip('삭제할문자들')

    • 삭제할 문자들을 문자열 형태로 넣으면 문자열 오른쪽에 있는 해당 문자 삭제
>>> ', python.'.rstrip(',.')  # 공백은 넣지 않았으므로 그대로 둔다.
', python'

12. 양쪽의 특정 문자 삭제하기

  • strip('삭제할문자들')

    • 삭제할 문자들을 문자열 형태로 넣으면 문자열 양쪽에 있는 해당 문자 삭제
>>> ', python.'.strip(',.')  # 공백은 넣지 않았으므로 그대로 둔다.
' python'

📎 참고) 구두점을 간단하게 삭제하기
string 모듈의 punctuation에는 모든 구두점이 들어있다. 다음과 같이 strip 메서드에 string.punctuation을 넣으면 문자열 양쪽의 모든 구두점을 간단하게 삭제할 수 있다.

>> import string
>> ', python.'.strip(string.punctuation)
' python'
>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

공백까지 삭제하고 싶다면 string.punctuation에 공백 ' '을 연결해서 넣어주면 된다.

>> ', python.'.strip(string.punctuation + ' ')
'python'

메서드 체이닝을 활용해도 된다.🔎

>> ', python.'.strip(string.punctuation).strip()
'python'

13. 문자열을 왼쪽 정렬하기

  • ljust(길이)

    • 문자열을 지정된 길이로 만든 뒤 왼쪽으로 정렬하며 남는 공간을 공백으로 채운다.
      (l은 왼쪽(left)을 의미)
>>> 'python'.ljust(10)
'python    '

14. 문자열을 오른쪽 정렬하기

  • rjust(길이)

    • 문자열을 지정된 길이로 만든 뒤 오른쪽으로 정렬하며 남는 공간을 공백으로 채운다.
      (r은 오른쪽(right)을 의미)
>>> 'python'.rjust(10)
'    python'

15. 문자열을 가운데 정렬하기

  • center(길이)

    • 문자열을 지정된 길이로 만든 뒤 가운데로 정렬하며 남는 공간을 공백으로 채운다.
>>> 'python'.center(10)
'  python  '

  • 가운데 정렬했을 때 전체 길이와 남는 공간이 모두 홀수가 된다면 왼쪽에 공백이 한 칸 더 들어간다.
>>> 'python'.center(11)
'   python  '

16. 메서드 체이닝

  • 문자열 메서드는 처리한 결과를 반환하도록 만들어져 있어 메서드를 계속 연결해서 호출하는 메서드 체이닝이 가능하다.
  • input().split()input()이 반환한 문자열에 split을 호출하는 메서드 체이닝이다.
# 문자열을 오른쪽으로 정렬한 뒤 대문자로 바꾸기
>>> 'python'.rjust(10).upper()
'    PYTHON'

17. 문자열 왼쪽에 0 채우기

  • zfill(길이)

    • 지정된 길이에 맞춰서 문자열의 왼쪽에 0을 채운다.
      ( zero fill을 의미)
    • 단, 문자열의 길이보다 지정된 길이가 작다면 아무것도 채우지 않는다.
    • 보통 숫자를 일정 자릿수로 맞추고 앞자리는 0으로 채울 때 사용
>>> '35'.zfill(4)        # 숫자 앞에 0을 채움
'0035'
>>> '3.5'.zfill(6)       # 숫자 앞에 0을 채움
'0003.5'
>>> 'hello'.zfill(10)    # 문자열 앞에 0을 채울 수도 있음
'00000hello'

18. 문자열 위치 찾기

  • find('찾을문자열')

    • 문자열에서 특정 문자열을 찾아서 인덱스 반환
    • 문자열이 없으면 -1 반환
    • 왼쪽에서부터 문자열을 찾는데, 같은 문자열이 여러 개일 경우 처음 찾은 문자열의 인덱스 반환
>>> 'apple pineapple'.find('pl')
2
>>> 'apple pineapple'.find('xy')
-1

19. 오른쪽에서부터 문자열 위치 찾기

  • rfind('찾을문자열')

    • 오른쪽에서부터 특정 문자열을 찾아서 인덱스 반환
      (r은 오른쪽( right)을 의미)
    • 문자열이 없으면 -1 반환
    • 같은 문자열이 여러 개일 경우 처음 찾은 문자열의 인덱스 반환
>>> 'apple pineapple'.rfind('pl')
12
>>> 'apple pineapple'.rfind('xy')
-1

20. 문자열 위치 찾기

  • index('찾을문자열')

    • 왼쪽에서부터 특정 문자열을 찾아서 인덱스 반환
    • 문자열이 없으면 에러 발생
    • 같은 문자열이 여러 개일 경우 처음 찾은 문자열의 인덱스 반환
>>> 'apple pineapple'.index('pl')
2

21. 오른쪽에서부터 문자열 위치 찾기

  • rindex('찾을문자열')

    • 오른쪽에서부터 특정 문자열을 찾아서 인덱스 반환
      (r은 오른쪽(right)
    • 문자열이 없으면 에러 발생
    • 같은 문자열이 여러 개일 경우 처음 찾은 문자열의 인덱스 반환
>>> 'apple pineapple'.rindex('pl')
12

22. 문자열 개수 세기

  • count('문자열')

    • 현재 문자열에서 특정 문자열이 몇 번 나오는지 알아낸다.
>>> 'apple pineapple'.count('pl')
2

24.2 문자열 서식 지정자와 포매팅 사용하기

문자열 안에서 특정 부분을 원하는 값으로 바꿀 때 서식 지정자 또는 문자열 포매팅을 사용한다.

24.2.1 서식 지정자로 문자열 넣기

  • '%s' % '문자열'

    • 서식 지정자는 %로 시작하고 자료형을 뜻하는 문자가 붙는다.
    • %s는 문자열이라는 뜻이며 string의 s이다.
    • 문자열을 바로 지정하지 않고 변수를 지정할 수도 있다.
>>> 'I am %s.' % 'james' # 'I am %s.'과 'james' 사이의 %는 따옴표로 묶지 않고 그대로 입력
'I am james.'

# 변수로 지정
>>> name = 'maria'
>>> 'I am %s.' % name
'I am maria.'

24.2.2 서식 지정자로 숫자 넣기

  • '%d' % 숫자

    • 숫자는 %d를 넣고 % 뒤에 숫자를 지정
    • %d는 10진 정수 decimal integer의 d
>>> 'I am %d years old.' % 20
'I am 20 years old.'

24.2.3 서식 지정자로 소수점 표현하기

  • '%f' % 숫자와 '%.자릿수f' % 숫자

    • 실수를 넣을 때는 %f를 사용
    • 고정 소수점 fixed point의 f
    • %f는 기본적으로 소수점 이하 6자리까지 표시
    • 소수점 이하 자릿수를 지정하고 싶다면 f 앞에 .(점)과 자릿수 지정
# '%f' % 숫자
>>> '%f' % 2.3
'2.300000'

# '%.자릿수f' % 숫자
>>> '%.2f' % 2.3
'2.30'
>>> '%.3f' % 2.3
'2.300'

24.2.4 서식 지정자로 문자열 정렬하기

  • %길이s

    • 문자열을 지정된 길이로 만든 뒤 오른쪽으로 정렬하고 남는 공간을 공백으로 채운다.
>>> '%10s' % 'python'
'    python'  # 문자열의 길이를 10으로 만든 뒤 지정된 문자열을 넣고 오른쪽 정렬. 남은 공간 공백으로 채움

📎 참고) 자릿수가 다른 숫자 출력하기

  • 문자열 오른쪽 정렬은 자릿수가 다른 숫자를 출력할 때 유용
  • %d와 %f도 숫자와 조합하여 오른쪽으로 정렬할 수 있다.
    %길이d
>> '%10d' % 150
'       150'
>> '%10d' % 15000
'     15000'

%길이.자릿수f

>> '%10.2f' % 2.3
'      2.30'
>> '%10.2f' % 2000.3
'   2000.30'

실수는 점(.)앞에 정렬할 길이를 정하고, 점 뒤에 소수점 이하 자릿수를 지정한다.

  • %-길이s

    • 문자열을 지정된 길이로 만든 뒤 왼쪽으로 정렬하고 남는 공간을 공백으로 채운다.
>>> '%-10s' % 'python'
'python    '

24.2.5 서식 지정자로 문자열 안에 값 여러 개 넣기

  • '%d %s' % (숫자, '문자열')

    • 문자열 안에 값을 두 개 이상 넣으려면 %를 붙이고, 괄호 안에 값(변수)을 콤마로 구분해서 넣는다.
    • 서식 지정자가 두 개이므로 값도 두 개
      (서식 지정자가 여러 개면 괄호 안의 값(변수) 개수도 서식 지정자 개수와 같아야 한다.)
    • 지정자를 서로 붙이면 결과도 붙어서 나온다.
>>> 'Today is %d %s.' % (3, 'April')
'Today is 3 April.'

# 서식지정자를 서로 붙인 경우
>>> 'Today is %d%s.' % (3, 'April')
'Today is 3April.'

24.2.6 format 메서드 사용하기

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

    • 문자열 포매팅은 중괄호({}) 안에 포매팅을 지정하고 format 메서드로 값을 넣는다.
    • 문자열 안에 { }를 넣고 인덱스를 지정
    • format에는 { } 부분에 넣을 값 지정
>>> 'Hello, {0}'.format('world!')
'Hello, world!'
>>> 'Hello, {0}'.format(100)
'Hello, 100'

24.2.7 format 메서드로 값을 여러 개 넣기

>>> 'Hello, {0} {2} {1}'.format('Python', 'Script', 3.6)
'Hello, Python 3.6 Script'

24.2.8 format 메서드로 같은 값을 여러 개 넣기

  • 같은 인덱스가 지정된 { }를 여러 개 넣으면 같은 값이 여러 개 들어간다.
>>> '{0} {0} {1} {1}'.format('Python', 'Script')
'Python Python Script Script'

24.2.9 format 메서드에서 인덱스 생략하기

  • 만약 { }에서 인덱스를 생략하면 format에 지정한 순서대로 값이 들어간다.
>>> 'Hello, {} {} {}'.format('Python', 'Script', 3.6)
'Hello, Python Script 3.6'

24.2.10 format 메서드에서 인덱스 대신 이름 지정하기

  • { }에 인덱스 대신 이름을 지정할 수도 있습니다.
'Hello, {language} {version}'.format(language='Python', version=3.6)
'Hello, Python 3.6'

24.2.11 문자열 포매팅에 변수를 그대로 사용하기

  • 파이썬 3.6부터는 문자열을 만드는 더 간단한 방법 제공
  • 변수에 값을 넣고 { }에 변수 이름을 지정
  • 이때는 문자열 앞에 포매팅(formatting)이라는 뜻으로 f를 붙인다.
>>> language = 'Python'
>>> version = 3.6
>>> f'Hello, {language} {version}'
'Hello, Python 3.6'

📎 참고) 중괄호 출력하기
{ } 중괄호 자체를 출력할 때는 {{, }}처럼 중괄호를 두 번 사용

>> '{{ {0} }}'.format('Python')
'{ Python }'

24.2.12 format 메서드로 문자열 정렬하기

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

    • 인덱스 뒤에 콜론(:)을 붙이고 정렬할 방향과 길이를 지정
>>> '{0:<10}'.format('python')  # 부등호 방향이 왼쪽이므로 왼쪽으로 정렬한 후 남는 공간을 공백으로 채움
'python    '

>>> '{0:>10}'.format('python')  # 부등호 방향이 오른쪽이므로 오른쪽으로 정렬한 후 남는 공간을 공백으로 채움
'    python'

  • 인덱스를 사용하지 않는다면 콜론(:)과 정렬 방법만 지정해도 된다.
>>> '{:>10}'.format('python')
'    python'

24.2.13 숫자 개수 맞추기

1) 정수

  • '%0개수d' % 숫자
  • '{인덱스:0개수d'}'.format(숫자)
>>> '%03d' % 1
'001'
>>> '{0:03d}'.format(35)
'035'

2) 실수

  • '%0개수.자릿수f' % 숫자
  • '{인덱스:0개수.자릿수f'}.format(숫자)
    • 실수는 숫자 개수에 정수 부분, 소수점, 소수점 이하 자릿수가 모두 포함
>>> '%08.2f' % 3.6
'00003.60'
>>> '{0:08.2f}'.format(150.37)
'00150.37'

24.2.14 채우기와 정렬을 조합해서 사용하기

  • '{인덱스:[[채우기]정렬][길이][.자릿수][자료형]}'

    • 실수로 만들고 싶다면 소수점 자릿수와 실수 자료형 f를 지정
    • 채우기 부분에 0이 아닌 다른 문자를 넣어도 된다.
      (채우기 부분 생략 시 공백이 들어감)
>>> '{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:>10}'.format(15)     # 채우기 부분을 생략하면 공백이 들어감
'        15'
>>> '{0:x>10}'.format(15)    # 남는 공간을 문자 x로 채움
'xxxxxxxx15'

📎 참고) 금액에서 천단위로 콤마 넣기
format 내장 함수를 사용하는 방법

# 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'

24.3 연습문제: 파일 경로에서 파일명만 가져오기

다음 소스 코드를 완성하여 파일 경로에서 파일명만 출력되게 만드세요. 단, 경로에서 폴더의 깊이가 달라지더라도 파일명만 출력할 수 있어야 합니다.

# 문제
path = 'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\python.exe'
_________________________________
...
_________________________________       
 
print(filename)
# 실행결과
python.exe
# 정답
x = path.split('\\')
filename = x[-1]
또는
x = path.split('\\')
x.reverse()
filename = x[0]
또는
filename = path[path.rfind('\\') + 1:]

파일 경로 path에서 파일명만 출력해야 하는데 경로에서 폴더의 깊이는 달라질 수 있다고 했으므로 path'\\'기준으로 분리한 뒤 리스트에서 마지막 요소 직접 가져오면 폴더의 깊이가 달라졌을 때 파일명을 가져올 수 없다.
이때는 filename = x[-1]과 같이 인덱스를 -1로 지정해서 마지막 요소를 가져온다.
또는, reverse로 리스트의 순서를 뒤집어준 뒤 filename = x[0]처럼 첫 번째 요소를 가져오면 된다.
(파일 경로에서 항상 마지막은 파일명이므로)

rfind를 사용해서도 파일명을 구할 수 있다.
path.rfind('\\')와 같이 rfind를 사용하여 오른쪽에서부터 '\\'의 인덱스를 찾는다.
path[path.rfind('\\') + 1:]와 같이 찾은 인덱스 + 1부터 문자열의 마지막까지 가져오면 파일명을 가져올 수 있다.
\는 제어 문자를 위한 이스케이프이므로 \ 문자 자체를 찾을 때는 \를 두 번 써야한다.

📎 참고) raw 문자열 사용하기
문자열 앞에 r 또는 R을 붙이면 raw 문자열이 된다.
raw 문자열은 이스케이프 시퀀스를 그대로 저장할 때 사용
즉, \\\로 두 번 쓰지 않고 한 번만 써도 됩니다.

python
>> print(r'C:\Users\dojang\AppData\Local\Programs\Python\Python36-32\python.exe')
C:\Users\dojang\AppData\Local\Programs\Python\Python36-32\python.exe

raw는 가공되지 않고 있는 그대로라는 뜻으로 이스케이프 시퀀스를 문자 그대로 표현한다.

>> print(r'1\n2\n3\n')
1\n2\n3\n
profile
안녕하세요 :-) 잘 부탁드립니다!

0개의 댓글