Github blog a production story
Shortcut

문자열 자료형

문자열(string)이란 연속된 문자들의 나열이다.

큰 따옴표(“)로 둘러쌓여 있는 것은 문자열이라고 보면 된다.

“ABCD” “g” “123”

"Hello World"
'Python is fun'
"""Life is too short, You need python"""
'''Life is too short, You need python'''
>>> food = "Python's favorite food is perl"
>>> food
"Python's favorite food is perl"
>>> food = 'Python's favorite food is perl'
  File "<stdin>", line 1
    food = 'Python's favorite food is perl'
                   ^
SyntaxError: invalid syntax
>>> say = '"Python is very easy." he says.'
>>> say
'"Python is very easy." he says.'
>>> food = 'Python\'s favorite food is perl'
>>> food
"Python's favorite food is perl"

>>> say = "\"Python is very easy.\" he says."
>>> say
'"Python is very easy." he says.'
>>> multiline = "Life is too short\nYou need python"
>>> print(multiline)
Life is too short
You need python
>>> multiline = '''
... Life is too short
... You need python
... '''
>>> print(multiline)

Life is too short
You need python

이스케이프 코드 이스케이프(escape) 코드란 프로그래밍할 때 사용할 수 있도록 미리 정의해 둔 ‘문자 조합’을 말한다. 주로 출력물을 보기 좋게 정렬하는 용도로 사용한다. 몇 가지 이스케이프 코드를 정리하면 다음과 같다.

코드 설명
\n 문자열 안에서 줄을 바꿀 때 사용
\t 문자열 사이에 탭 간격을 줄 때 사용
\\ \를 그대로 표현할 때 사용
\' 작은따옴표(‘)를 그대로 표현할 때 사용
\" 큰따옴표(“)를 그대로 표현할 때 사용
\r 캐리지 리턴(줄 바꿈 문자, 커서를 현재 줄의 가장 앞으로 이동)
\f 폼 피드(줄 바꿈 문자, 커서를 현재 줄의 다음 줄로 이동)
\a 벨 소리(출력할 때 PC 스피커에서 ‘삑’ 소리가 난다)
\b 백 스페이스
\000 널 문자

이 중에서 활용 빈도가 높은 것은 \n\t\\\'\"이다. 나머지는 프로그램에서 잘 사용하지 않는다.

1. 문자열 연산

>>> head = "Python"
>>> tail = " is fun!"
>>> head + tail
'Python is fun!'
>>> a = "python"
>>> a * 2
'pythonpython'
print("=" * 50)
print("My Program")
print("=" * 50)
==================================================
My Program
==================================================
>>> a = "Life is too short"
>>> len(a)
17
>>> a = "Life is too short, You need Python"
>>> a[3]
'e'
L i f e   i s   t o o   s h o r t ,   Y o u   n e e d   P y t h o n
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

2. 문자열 인덱싱

>>> a = "Life is too short, You need Python"
>>> a[0]
'L'
>>> a[-0]
'L'
>>> a[12]
's'
>>> a[-1]
'n'
>>> a[-2]
'o'

3. 문자열 슬라이싱

>>> a = "Life is too short, You need Python"
>>> >>> a[0] + a[1] + a[2] + a[3]
'Life'
>>> a[0:3]
'Lif'
>>> a[0:4]
'Life'
a[0:3]
0 <= a < 3
a[시작번호:끝번호]
>>> a[:17]
'Life is too short'
>>> a[:]
'Life is too short, You need Python'
>>> a = "20230331Rainy"
>>> date = a[:8]
>>> weather = a[8:]
>>> date
'20230331'
>>> weather
'Rainy'
>>> a = "20230331Rainy"
>>> year = a[:4]
>>> day = a[4:8]
>>> weather = a[8:]
>>> year
'2023'
>>> day
'0331'
>>> weather
'Rainy'
>>> year + ' ' + day + ' ' + weather
'2023 0331 Rainy'
>>> a = "Pithon"
>>> a[1]
'i'
>>> a[1]='y'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> a[:1] + 'y' + a[2:]
'Python'

a변수에 “Pithon” 문자열을 대입하고 a[1]의 값이 i이므로 a[1]을 y로 바꾸어 준다는 생각이다. 하지만 결과는 어떻게 나올까? 당연히 오류가 발생한다. 문자열의 요솟값은 바꿀 수 있는 값이 아니기 때문이다(그래서 문자열을 ‘변경 불가능한(immutable) 자료형’이라고도 부른다). 슬라이싱을 사용하면 “Pithon” 문자열을 ‘P’ 부분과 ‘thon’ 부분으로 나눌 수 있고, 그 사이에 ‘y’ 문자를 추가하면 ‘Python’이라는 새로운 문자열을 만들 수 있다.

4. 문자열 포매팅

문자열에서 또 하나 알아야 할 것으로는 ‘문자열 포매팅(string formatting)’이 있다. 문자열 포매팅이란 문자열 안에 어떤 값을 삽입하는 방법이다.

>>> "I eat %d apples." % 3
'I eat 3 apples.'
>>> print("i eat %d apples." % 3)
i eat 3 apples.

문자열 안의 숫자를 넣고 싶은 자리에 %d 문자를 넣어 주고 삽입할 숫자 3은 가장 뒤에 있는 % 문자 다음에 써 넣었다. 여기에서 %d는 ‘문자열 포맷 코드’라고 부른다.

>>> "I eat %s apples." % "five"
'I eat five apples.'
>>> print("I eat %s apples." % "five")
I eat five apples.

문자열 안에 또 다른 문자열을 삽입하기 위해 앞에서 사용한 문자열 포맷 코드 %d가 아닌 %s를 썼다.

>>> num = 3
>>> "i eat %d apples." % num
'i eat 3 apples.'
>>> print("i eat %d apples." % num)
i eat 3 apples.
>>> num = 10
>>> day = "three"
>>> "I ate %d apples. So i was sick for %s days." % (num, day)
'I ate 10 apples. So i was sick for three days.'
>>> print("I ate %d apples. So i was sick for %s days." % (num, day))
I ate 10 apples. So i was sick for three days.

2개 이상의 값을 넣으려면 마지막 % 다음 괄호 안에 쉼표(,)로 구분하여 각각의 값을 넣어 주면 된다.

5. 문자열 포맷 코드

| 코드 | 설명 | | :-: | :——————-: | | %s | 문자열(String) | | %c | 문자 1개(character) | | %d | 정수(Integer) | | %f | 부동소수(floating-point) | | %o | 8진수 | | %x | 16진수 | | %% | Literal % (문자 % 자체) |

>>> "Error is %d%%." % 98
'Error is 98%.'

문자열 포맷 코드인 %d와 %가 같은 문자열 안에 존재하는 경우, %를 나타내려면 반드시 %%를 써야 한다, 하지만 문자열 안에 %d와 같은 포매팅 연산자가 없으면 %는 홀로 쓰여도 상관없다.

6. 포맷 코드와 숫자 함께 사용하기

6-1. 정렬과 공백

>>> "%10s" % "hi"
'        hi'

%10s는 전체 길이가 10개인 문자열 공간에서 대입되는 값을 오른쪽으로 정렬하고 그 앞의 나머지는 공백으로 남겨 두라는 의미이다.

Python-04st-01

반대쪽인 왼쪽 정렬은 %-10s가 될 것이다.

>>> "%-10sjane." % 'hi'
'hi        jane.'

hi를 왼쪽으로 정렬하고 나머지는 공백으로 채웠다는 것을 알 수 있다.

Python-04st-02

6-2. 소수점 표현하기

>>> "%0.4f" % 3.42134234
'3.4213'
>>> "%0.4f" % (124/23)
'5.3913'

%0.4f에서 ‘.’는 소수점 포인트, 그 뒤의 숫자 4는 소수점 뒤에 나올 숫자의 개수를 말한다. 소수점 포인트 앞의 숫자는 문자열의 전체 길이를 의미하는데, %0.4f에서 사용한 숫자 0은 길이에 상관하지 않겠다는 의미이다. %0.4f는 0을 생략하여 %.4f처럼 사용하기도 한다.

>>> "%10.4f" % 1.23456789
'    1.2346'

위는 숫자 1.23456789를 소수점 네 번째 자리까지만 표시하고 전체 길이가 10개인 문자열 공간에서 오른쪽으로 정렬하는 예를 보여 준다.

Python-04st-03

7. format 함수를 사용한 포매팅

문자열의 format 함수를 사용하면 좀 더 발전된 스타일로 문자열 포맷을 지정할 수 있다.

>>> "I eat {0} apples".format(3)
'I eat 3 apples'
>>> "I eat {0} apples".format("five")
'I eat five apples'
>>> number = 10
>>> day = "three"
>>> "I ate {0} apples. so I was sick for {1} days.".format(number, day)
'I ate 10 apples. so I was sick for three days.'

2개 이상의 값을 넣을 경우, 문자열의 {0}{1}과 같은 인덱스 항목이 format 함수의 입력값으로 순서에 맞게 바뀐다. 위 예에서 {0}은 format 함수의 첫 번째 입력값인 number, {1}은 format 함수의 두 번째 입력값인 day로 바뀐다.

>>> "I ate {number} apples. so I was sick for {day} days.".format(number=10, day=3)
'I ate 10 apples. so I was sick for 3 days.'

{0}{1}과 같은 인덱스 항목 대신 더 편리한 {name} 형태를 사용하는 방법도 있다. {name} 형태를 사용할 경우, format 함수에는 반드시 name=value와 같은 형태의 입력값이 있어야 한다. 위 예는 문자열의 {number}{day}가 format 함수의 입력값인 number=10, day=3 값으로 각각 바뀌는 것을 보여 주고 있다.

>>> "I ate {0} apples. so I was sick for {day} days.".format(10, day=3)
'I ate 10 apples. so I was sick for 3 days.'
>>> print("I ate {0} apples. so I was sick for {1} days.".format(number, day))
I ate 10 apples. so I was sick for three days.
>>> "I ate {number} apples. so I was sick for {day} days.".format(number=10, day=3)
'I ate 10 apples. so I was sick for 3 days.'
>>> print("I ate {0} apples. so I was sick for {day} days.".format(10, day=3))
I ate 10 apples. so I was sick for 3 days.

:<10 표현식을 사용하면 치환되는 문자열을 왼쪽으로 정렬하고 문자열의 총 자릿수를 10으로 맞출 수 있다. 오른쪽 정렬은 :< 대신 :>을 사용하면 된다. :^를 사용하면 가운데 정렬도 가능하다.

>>> "{0:<10}".format("hi")
'hi        '
>>> "{0:>10}".format("hi")
'        hi'
>>> "{0:^10}".format("hi")
'    hi    '

정렬할 때 공백 문자 대신 지정한 문자 값으로 채워 넣을 수도 있다. 채워 넣을 문자 값은 정렬 문자 <>^ 바로 앞에 넣어야 한다. 위 예에서 첫 번째 예제는 가운데(^)로 정렬하고 빈 공간을 (=)로 채웠고, 두 번째 예제는 왼쪽(<)으로 정렬하고 빈 공간을 !로 채웠다.

>>> "{0:=^10}".format("hi")
'====hi===='
>>> "{0:!<10}".format("hi")
'hi!!!!!!!!'
>>> "{0:a^10}".format("hi")
'aaaahiaaaa'

format 함수를 사용해 소수점을 4자리까지만 표현하는 방법을 보여 준다. 앞에서 살펴보았던 표현식 0.4f를 그대로 사용한 것을 알 수 있다.

>>> "{0:0.4f}".format(a)
'1.2346'
>>> "{0:10.4f}".format(a)
'    1.2346'

위와 같이 자릿수를 10으로 맞출 수도 있다. 이 또한 앞에서 살펴본 10.4f의 표현식을 그대로 사용한 것을 알 수 있다.

>>> "".format()
'{ and }'

format 함수를 사용해 문자열을 포매팅할 경우, {}와 같은 중괄호 문자를 포매팅 문자가 아닌 문자 그대로 사용하고 싶은 경우에는 위 예의 ``처럼 2개를 연속해서 사용하면 된다.

8. f 문자열 포매팅

파이썬 3.6 버전부터는 f 문자열 포매팅 기능을 사용할 수 있다. 파이썬 3.6 미만 버전에서는 사용할 수 없는 기능이므로 주의해야 한다. 문자열 앞에 f 접두사를 붙이면 f 문자열 포매팅 기능을 사용할 수 있다.

>>> name = '홍길동'
>>> age = 30
>>> f'나의 이름은 {name}입니다. 나이는 {age}입니다.'
'나의 이름은 홍길동입니다. 나이는 30입니다.'

f 문자열 포매팅은 표현식을 지원하기 때문에 다음과 같은 것도 가능하다.

표현식이란 중괄호 안의 변수를 계산식과 함께 사용하는 것을 말한다.

>>> age = 30
>>> f'나는 내년이면 {age + 1}살이 된다.'
'나는 내년이면 31살이 된다.'

딕셔너리는 f 문자열 포매팅에서 다음과 같이 사용할 수 있다.

>>> d = {'name':'홍길동', 'age':30}
>>> f'나의 이름은 {d["name"]}입니다. 나이는 {d["age"]}입니다.'
'나의 이름은 홍길동입니다. 나이는 30입니다.'

딕셔너리는 Key와 Value라는 것을 한 쌍으로 가지는 자료형이다.

>>> f'{"hi":<10}'  # 왼쪽 정렬
'hi        '
>>> f'{"hi":>10}'  # 오른쪽 정렬
'        hi'
>>> f'{"hi":^10}'  # 가운데 정렬
'    hi    '
>>> f'{"hi":=^10}'  # 가운데 정렬하고 '=' 문자로 공백 채우기
'====hi===='
>>> f'{"hi":!<10}'  # 왼쪽 정렬하고 '!' 문자로 공백 채우기
'hi!!!!!!!!'
>>> a = 1.23456789
>>> f'{a:0.4f}'  # 소수점 4자리까지만 표현
'1.2346'
>>> f'{a:10.4f}'  # 소수점 4자리까지 표현하고 총 자리수를 10으로 맞춤
'    1.2346'
>>> f''
'{ and }'

9. 문자열 관련 함수들

9-1. count

>>> a = "happy"
>>> a.count('p')
2

9-2. find

>>> a = "Python is the best choice"
>>> a.find('b')
14
>>> a.find('t')
2
>>> a.find('k')
-1

9-3. index

>>> a = "Life is too short"
>>> a.index('t')
8
>>> a.index('k')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found

9-4. join

>>> ",".join('abcd')
'a,b,c,d'
>>> ",".join(['a', 'b', 'c', 'd'])
'a,b,c,d'
>>> ",".join("abcd efg")
'a,b,c,d, ,e,f,g'

9-5. upper

>>> a = "abcdefg"
>>> a.upper()
'ABCDEFG'

9-6. lower

>>> a = "ABCDEFG"
>>> a.lower()
'abcdefg'

9-7. lstrip

>>> a = "  abcdefg  "
>>> a.lstrip()
'abcdefg  '

9-8. rstrip

>>> a = "  abcdefg  "
>>> a.rstrip()
'  abcdefg'

9-9. strip

>>> a = "  abcdefg  "
>>> a.strip()
'abcdefg'

9-10. replace

>>> a = "Life is too short"
>>> a.replace("Life", "Your leg")
'Your leg is too short'

9-11. split

>>> a = "Life is too short"
>>> a.replace("Life", "Your leg")
'Your leg is too short'
>>> a = "Life is too short"
>>> a.split()
['Life', 'is', 'too', 'short']
>>> b = "a:b:c:d"
>>> b.split(':')
['a', 'b', 'c', 'd']

태그:

카테고리:

업데이트:

댓글남기기