본문 바로가기

진리는어디에/Python

[Python] 문자열

이번 포스트에서는 파이썬의 문자열에 대해 알아 보도록 하겠다. 강력한 문자열 관련 기능들은 파이썬이 많은 사람들에게 사랑 받는 이유 중의 하나다. 집중해서 살펴 보자. 

문자열 리터럴 표기법

# 문자열 리터럴 표기법
s1 = 'hello' # 싱글 따옴표로 감싸면 문자열을 나타낸다
s2 = "hello" # 쌍따옴표 역시 동일한 의미를 가진다

# 문자열안에 "를 사용
s3 = "To be or \"not\" to be"
s4 = 'To be or "not" to be'

# 여러줄 문자열 리터럴
s5 = "AAA\nBBB\nCCC" # 개행 문자 사용
# 싱글 따옴표나 쌍따옴표 세개로 감싸고 직접 개행을 한다
s6 = """AAA
BBB
CCC"""
Tip. 파이썬 멀티 라인 주석

공식적으로 파이썬에는 #외에 여러 줄에 걸친 주석을 만들 수 있는 방법은 없다. 파이썬에서 아무런 변수에도 할당하지 않은 값은 인터프리터가 무시하는 것을 이용해 싱글 따옴표나 쌍따옴표 세개로 감싼 멀티 라인 문자열을 아무런 변수에 할당하지 않으면 마치 멀티 라인 주석 처럼 사용 할 수 있다.

'''
사실은 문자열이지만
아무런 변수에도 할당 되지 않았기 때문에
인터프리터가 무시 합니다.
''' 

s = '''
이 문자열은
변수 s에 할당 되기 때문에
인터프리터가 무시 하지 않습니다.
'''

문자열 연산자

1. 문자열 생성

s1 = str('hello')
s2 = str()
s3 = 'hello'

1라인에서 str 함수로 부터 문자열을 생성한다. 2라인에서 아무런 인자 없이 str()만 호출하게 되면 빈 문자열 객체가 생성 된다.

2. + 와 * 연산자

s1 = 'Hello'
s2 = 'World'
s3 = s1 + s2
s4 = s1 * 4

print(s3) # HelloWorld
print(s4) # HelloHelloHelloHello

파이썬 문자열은 + 와 * 연산을 제공한다. + 는 두 문자열을 합치는데 사용. * 는 정수를 다음 인자로 받아 해당 숫자만큼 문자열을 반복한다.

Tip. 텍스트로 구분선 만들기

파이썬 문자열은 * 연산을 지원한다. 이를 이용하여 복잡한 반복문 없이 간단하게 텍스트를 이용한 구분선을 만들 수 있다.

> print('=' * 20)
====================

3. [] 연산자

s = 'hello'
print(s[0]) # h
s[1] = 'x' # TypeError: 'str' object does not support item assignment

파이썬 문자열은 배열 연산을 지원하여 인덱스를 통하여 개별 문자에 접근 할 수 있다. 하지만 str 타입은 immutable 타입이므로 3라인 처럼 문자열의 값을 변경하려고 하면 에러를 발생 시킨다. immutable 타입에 대한 설명은 [여기]를 참고 하자. 보다 자세한 사항은 아래 '문자열 인덱싱' 섹션에서 설명하고 있다.

4. in 연산자

s = 'hello'
print('o' in s) # True
print('he' in s) # True

in 연산자는 문자열이 특정 문자열을 포함하고 있는지를 조사하는 연산자다. 위의 경우 'o'나 'he' 모두 'hello'에 포함 되어 있으므로 둘 다 True를 리턴한다.

문자열 함수

1. len(s) 표준 함수

s = 'hello'
print(len(s)) # 5

문자열의 길이를 조사하기 위해서는 len() 표준 함수를 사용한다.
※ str 객체는 문자열 길이를 리턴하는 메소드가 없다.

str 주요 메소드

str 메소드 요약

1. upper(), lower() 메소드

s = 'HEllo' # s는 변화 없음
s1 = s.upper() # HELLO
s2 = s.lower() # hello

upper(), lower() 메소드는 문자열을 대문자 또는 소문자로 변경하여 새로운 문자열 객체를 만들어 리턴한다. 원본 문자열은 변화가 없다.

2. count(), find(), index() 메소드

s = 'hello'

print(s.count('l'))	# 2
print(s.find('l'))	# 2
print(s.index('l'))	# 2

print(s.find('a'))	# -1
print(s.index('a'))	# ValueError

3라인의 카운트는 원본 문자열에서 찾고 있는 문자열의 개수를 리턴한다. 'hello'에는 'l'이 두개가 있으므로 2를 출력한다.

4~5라인의 find와 index는 가장 먼저 매칭 되는 문자열의 인덱스를 리턴한다. 0 베이스의 문자 배열 'hello'에서 'l'은 3번째 즉, 2번 인덱스이므로 둘 다 2를 출력한다. find와 index의 차이는 문자열을 찾지 못하는 경우 처리 방식이다. find의 경우 문자열을 찾지 못하는 경우 -1을 리턴하고, index는 ValueError를 발생 시킨다.

3. strip(), lstrip(), rstrip() 메소드

s = ' hello '
print('|' + s          + '|') # | hello |
print('|' + s.strip()  + '|') # |hello|
print('|' + s.lstrip() + '|') # |hello |
print('|' + s.rstrip() + '|') # | hello|

strip 메소드는 원본 문자열에서 공백을 제거한 새 문자열 객체를 리턴한다. lstrip은 왼쪽에 있는 공백만, rstrip은 오른쪽에 있는 공백만을 제거한다.

4. replace 메소드

s1 = 'python is simple'
s2 = s1.replace('simple', 'complicated')

replace 메소드는 기존에 있던 문자열을 대체한 새 문자열 객체를 리턴한다.

5. join 메소드

s1 = 'ABCDEFG'
s2 = '/'.join(s1)

print(s2) # A/B/C/D/E/F/G

join 문자열은 원본 문자열을 대상 문자열의 각 문자 사이에 넣어 합친 새 문자열 객체를 리턴한다.

6. split 메소드

s1 = 'To be or not to be, that is the question'
s2 = s1.split()
print(s2) # ['To', 'be', 'or', 'not', 'to', 'be,', 'that', 'is', 'the', 'question']

원본 문자열을 단어별로 쪼개 리스트 형태로 리턴한다.

문자열 인덱싱

문자열 인덱싱은 인덱스를 이용해 문자열의 특정 위치의 문자에 접근하는 것이다. 파이썬에서는 양수 인덱싱과 음수 인덱싱 둘 다 지원한다.

양수 인덱싱은 일반적으로 우리가 배열을 사용하는 것과 동일하게 0을 기본으로하여 왼쪽에서 오른쪽으로 증가한다. 반면 음수 인덱싱은 -1을 기본으로 오른쪽에서 왼쪽으로 감소한다.

s = 'ABCDE'

print(s[0]) # A
print(s[4]) # E

print(s[-1]) # E
print(s[-0]) # -0은 0이다. A
print(s[-5]) # A

문자열 슬라이싱

문자열 인덱싱은 배열 연산자를 이용하여 문자열에서 특정 문자 한글자를 얻어 온 것이라면, 문자열 슬라이싱은 배열 연산자를 이용하여 인덱스 "범위"에 있는 여러 문자들(문자열)을 얻어오는 것이라 할 수 있다.

문자열 슬라이싱을 하는 방법은 slice 객체를 이용하거나, 단축 표기법을 이용하여 슬라이 객체를 암묵적으로 생성하여 대신 할 수 있다.

  • slice(first, last, step) : first 인덱스 부터(포함), last 인덱스 전까지(미포함). step만큼 인덱스 증가
  • slice(count) : 0번 인덱스 부터 count 개수만큼 슬라이싱
  • 단축 표기법 : [:] 또는 [::] 사용. 
s = 'ABCDEFGHIJK'

sc = slice(1, 4) # 1번 인덱스 부터(포함), 4번 인덱스 전까지(미포함)의 범위

s1 = s[sc]
print(s1)

print(s[slice(1, 7, 2)])    # 1번 인덱스 부터(포함), 7번 인덱스 전까지(미포함)의 범위, 2씩 인덱스 증가
                            # BDF
print(s[slice(-1, -8, -2)]) # -1번 인덱스 부터(포함), -8번 인덱스 전까지(미포함)의 범위, -2씩 인덱스 감소
                            # KIGE
print(s[slice(5)])          # 0번 인덱스 부터 5개
                            # ABCDE
print(s[slice(len(s))])     # 0번 인덱스 부터 문자열 s의 길이만큼. 전체 문자열
                            # ABCDEFGHIJK
                            
print(s[1:7])               # slice(1, 7)
                            # BCDEFG
print(s[1:7:2])             # slice(1, 7, 2)
                            # BDF
print(s[-1:-8:-2])          # slice(-1, -8, -2)
                            # KIGE
print(s[5::])               # FGHIJK
print(s[::])                # ABCDEFGHIJK
print(s[-1::-1])            # KJIHGFEDCBA

마치며

이상으로 파이썬 문자열의 사용법에 대해 알아 보았다. 다음 장에서는 파이썬의 이터레이션에 대해 알아 보도록 하겠다.

부록 1. 같이 보면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!