상세 컨텐츠

본문 제목

[ Python 기초 문법 ] - 자료형(2) - 문자열 자료형

Language/Python

by bing_su 2021. 1. 11. 16:51

본문

반응형
SMALL

이번에 다룰 자료형은 문자열 자료형이다. 그전에 문자열이 무엇인지 짚어보자.

 

문자열(string)은 문자, 단어 등으로 구성된 문자들의 집합이다.

[ 문자열을 만들고 사용하는 방법 ]

파이썬에서 문자열을 만드는 방법은 아래와 같이 총 4가지이다.

- 큰따옴표(")로 양쪽 둘러싸기

"Hello world"

- 작은따옴표(')로 양쪽 둘러싸기

'Bingsu is delicious'

- 큰따옴표 3개를 연속(""")으로 써서 양쪽 둘러싸기

"""I want to sleep."""

- 작은따옴표 3개를 연속(''')으로 써서 양쪽 둘러싸기

'''I want to sleep.'''

< 문자열을 만드는 방법이 다양한 이유 >

- 문자열에 작은따옴표(') 포함시키기: 작은따옴표(')가 포함되어 있는 경우 이 작은따옴표가 문자열을 나타내기 위한 기호로 인식되지 않도록 문자열을 큰따옴표(")로 둘러싸야한다.

>>> food = "Python's favorite food is perl"
>>> food
"Python's favorite food is perl"

작은따옴표(')로 문자열을 둘러싼 후 실행하면, 다음과 같은 구문 오류가 발생하게 된다.

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

- 백슬래시를 사용해서 작은따옴표(')와 큰따옴표(")를 문자열에 포함시키기: 백슬래시(\) 뒤의 작은따옴표(')나 큰따옴표(")는 문자열을 둘러싸는 기호의 의미가 아니라 문자 ('), (") 그 자체를 뜻한다.

>>> food = 'Python\'s favorite food is perl'
>>> say = "\"Python is very easy.\" he says."

< 여러 줄인 문자열을 변수에 대입할 때 >

- 줄을 바꾸는 이스케이프 코드 '\n' 삽입하기

>>> multiline = "Life is too short\nYou need python"

- 이스케이프 코드: 프로그래밍 시 사용할 수 있도록 미리 정의해 둔 '문자 조합'이다. 주로 출력물을 보기 좋게 정렬하는 용도로 사용한다. 아래는 몇 가지 이스케이프 코드의 예시이다.

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

- 연속된 작은따옴표 3개(''') 또는 큰따옴표(""") 사용하기

>>> multiline = '''
··· Life is too short
··· You need python
··· '''

위에서 작은따옴표 3개(''') 대신 큰따옴표 3개(""")를 사용해도 된다.

 

이스케이프 코드를 사용한 경우와 따옴표 3개를 쓴 경우 모두 동일한 결과가 나온다.

[ 문자열 연산하기 ]

- 문자열 더해서 연결하기(Concatenation): 두 변수를 +에 의해 합쳐서 문자열을 출력할 수 있다.

>>> head = "Python"
>>> tail = " is fun"
>>> head + tail'Python is fun!'

- 문자열 곱하기: *는 문자열의 반복의 의미로 사용된다.

>>> a = "Python"
>>> a * 2
'pythonpython'

- 문자열 길이 구하기: len 함수를 사용하면 구할 수 있다. len 함수는 파이썬의 기본 내장 함수이다.

>>> a = "Life is too short"
>>> len(a)
17

[ 문자열 인덱싱 ]

- 인덱싱(Indexing): 무엇인가를 '가리킨다'는 의미이다.

 

- a[번호]를 통해 문자열 안의 특정 값을 뽑아낼 수 있다.

>>> a = "Life is too short, You need Python"
>>> a[3]
'e'

파이썬은 0부터 숫자를 세기 때문에 a[i]는 (i+1)번째 문자를 가리킨다.

 

- 문자열을 뒤에서부터 읽을 경우에는 마이너스(-) 기호를 붙인다. a[-i]와 같은 경우는 뒤에서 i번째 문자를 가리킨다.

단, a[-0]은 a[0]와 동일하게 첫 문자를 가리킨다. ( a[0] == a[-0] )

[ 문자열 슬라이싱 ]

- 슬라이싱(slicing): 무엇인가를 '잘라낸다'는 의미이다.

>>> a = "Life is too short, You need Python"
>>> a[0:4]
'Life'

- a[ i : j ]의 경우 인덱스 i부터 (j-1)번째까지의 문자를 뽑아낸다는 의미이다.

즉, 이를 수식으로 나타내면 i <= a < j 꼴로 나타낼 수 있다.

 

1. 슬라이싱할 때 항상 시작 번호가 0일 필요는 없다.

2. a[시작 번호:끝 번호]에서 끝 번호를 생략하면 시작 번호부터 그 문자열의 끝까지 뽑아낸다.

3. a[시작 번호:끝 번호]에서 시작 번호를 생략하면 문자열의 처음부터 끝 번호까지 뽑아낸다.

4. a[시작 번호:끝 번호]에서 시작 번호와 끝 번호를 생략하면 문자열의 처음부터 끝까지를 뽑아낸다.

5. 슬라이싱에서 인덱싱과 마찬가지로 마이너스(-) 기호를 사용할 수 있고, 의미는 동일하다.

# a[19]에서부터 a[-8]까지 출력
>>> a[19:-7] 
'You need'

6. 슬라이싱을 통해 한 문자열을 여러 부분으로 나눌 수 있다.

>>> a = "20010331Rainy"
# 문자열을 두 부분으로 나눔
>>> date = a[:8]
>>> weather = a[8:]
>>> date
'20010331'
>>> weather
'Rainy'
# 문자열을 세 부분으로 나눔
>>> year = a[:4]
>>> day = a[4:8]
>>> year
'2001'
>>> day
'0331'
>>> weather
'Rainy'

< 슬라이싱 규칙 지정 >

앞서 슬라이싱에서는 a[ i : j ] 형태로 인덱스 번호 i부터 (j-1)까지의 문자를 뽑아낼 수 있었다.

 

여기서 a[ i : j : rule ]으로 세번째 숫자가 들어갈 수 있는데, 이 숫자는 슬라이싱을 할 때 규칙을 지정하는 역할을 한다. 지정하지 않으면 1이 디폴트 값으로 설정되며, 문자열을 앞에서부터 하나씩 잘라서 새로운 문자열을 만들어낸다. 즉, 해당 값이 2로 설정되면, 인덱스 번호 i부터 2씩 잘라서 새로운 문자열을 생성한다. (인덱스 기준으로는 i, i+2, i+4, …) 해당 값에 음수가 들어가면 뒤에서부터 문자열을 자를 수 있게 된다. 실습을 통해 확인해보자.

>>> a = "Hello Python!"

# 시작, 끝 지점 사용
>>> a[3:]  # index 3부터 끝까지 문자 하나씩 슬라이싱.
'lo Python!'
>>> a[2:6]  # index 2부터 6 직전까지 문자 하나씩 슬라이싱.
'llo '

# 음의 인덱스 사용
>>> a[:-2]  # index 처음부터 -2(n) 직전까지 문자 하나씩 슬라이싱.
'Hello Pytho'
>>> a[-4:]  # index -4(h)부터 끝까지 문자 하나씩 슬라이싱.
'hon!'
>>> a[-5:-2]  # index -5(t)부터 -2(n) 직전까지 문자 하나씩 슬라이싱.
'tho'

# 시작, 끝 지점/간격 사용
>>> a[1::2]  # index 1(e)부터 끝까지 2개 문자씩 슬라이싱.
'el yhn'
>>> a[2:6:2]  # index 2(l)부터 6(P) 직전까지 2개 문자씩 슬라이싱.
'lo'

# 음의 간격 사용하기
>>> a[::-1]  # 리스트의 처음부터 끝까지 거꾸로 하나씩 슬라이싱.
'!nohtyP olleH'
>>> a[::-2]  # 리스트의 처음부터 끝까지 거꾸로 두개씩 슬라이싱.
'!otPolH'

< 슬라이싱 기법을 사용해 새로운 문자열 만들기 >

문자열 자료형은 그 요솟값을 변경할 수 없다. 슬라이싱 기법을 이용하면 새로운 문자열로 변경하는 것이 가능하다.

>>> a = "Pithon"
>>> a[:1]'P'
>>> a[2:]'thon'
>>> a[:1] + 'y' + a[2:]
'Python'

슬라이싱을 통해 문자열 부분을 나눈 후, 그 사이에 문자를 추가하면 된다.

[ 문자열 포매팅 ]

: 문자열 안의 특정한 값을 바꿀 수 있도록 해준다. 즉, 문자열 안에 특정 값을 삽입하는 방법이다.

 

- 문자열 포맷 코드는 아래와 같이 정리할 수 있다.

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

< 문자열 포매팅 방법 >

1. 숫자를 바로 대입한다.

>>> "I eat %d apples." % 3
'I eat 3 apples.'

2. 문자열을 바로 대입한다.

>>> "I eat %s apples." % "five"  # 문자열 대입 시에는 큰따옴표나 작은따옴표를 반드시 써 줘야 한다.
'I eat five apples.'

3. 변수로 대입한다.

>>> number = 3
>>> "I eat %d apples." % number
'I eat 3 apples.'

4. 2개 이상의 값을 대입한다.

>>> number = 10
>>> day = "three"
>>> "I ate %d apples. so I was sick for %s days." % (number, day)
'I ate 10 apples. so I was sick for three days.'

< 포맷 코드와 숫자 함께 사용하기 >

1. 정렬과 공백: %ns 꼴은 전체 길이가 n인 문자열 공간에서 대입되는 값을 오른쪽으로 정렬하고, 그 앞의 나머지는 공백으로 남겨두라는 의미이다. 왼쪽 정렬의 경우 %-ns가 된다.

>>> "%5s" % "hi"
'   hi'  # hi가 오른쪽 정렬되었다.
>>> "%-5sjane" % "hi"
'hi   jane'  # hi가 왼쪽 정렬되었다.

2. 소수점 표현하기: %0.nf는 소수점 n번째 자리까지만 나타내고 싶을 경우 사용한다. 

# 숫자를 소수점 네 번째까지만 표시하고, 전체 길이를 10인 문자열 공간.
>>> "%10.4f" % 3.14159265
'     3.1415'

< format 함수를 사용한 포매팅 >

format 함수는 문자열에 특정 변수의 값을 넣을 때 사용한다. format 함수는 중괄호 안에 포매팅할 인자를 지정하고, format 함수로 인자의 값들을 넣으면 된다.

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

- 숫자를 바로 대입한다.

>>> "I eat {0} apples".format(3)
'I eat 3 apples'

- 문자열을 바로 대입한다.

>>> "I eat {0} apples".format("five")
'I eat five apples'

- 변수로 대입하기

>>> number = 3
>>> "I eat {0} apples".format(number)
'I eat 3 apples'

- 2개 이상의 값 넣기

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

- 이름으로 넣기: 인덱스 항목 대신 변수 이름을 사용하는 경우이다. 이때, 변수=value의 입력값이 반드시 있어야 한다.

>>> "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.'

- 인덱스와 이름을 혼용해서 넣기: 인덱스 항목과 name=value 형태를 혼용하는 것도 가능하다.

>>> "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.'

- 정렬: 왼쪽 정렬은 :<을 사용하면 되고, 오른쪽 정렬은 :>을 사용하면 된다. :^을 사용하면 가운데 정렬이 된다.

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

- 공백 채우기: 정렬 시 문자 값을 정렬 문자 <, >, ^ 바로 앞에 넣으면 지정 문자 값으로 채워 넣는 것이 가능하다.

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

- 소수점 표현하기: 포맷 코드와 숫자를 같이 사용한 표현을 그대로 사용한다.

>>> y = 3.251544
>>> "{0:10.4f}".format(y)
'     3.2515'

- { 또는 } 문자 표현하기: format 함수를 사용해 문자열 포매팅을 할 경우에 '{ }'와 같은 중괄호 문자를 그대로 사용하고 싶다면, {{ 또는 }}와 같이 2개를 연속으로 사용하면 된다.

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

- Python 3.6 ver 이후부터는 f 문자열 포매팅 기능을 사용할 수 있다. (Python 3.6 ver 미만에서는 사용 불가)

>>> name = 'bingsu'
>>> age = 22
>>> f'My name is {name}. Age is {age}.'
'My name is bingsu. Age is 22.'

f 문자열 포매팅은 변수 값 생성 후에 그 값을 참조할 수 있다.

또한, f 문자열 포매팅은 표현식을 지원하기 때문에 +, -와 같은 수식을 함께 사용할 수 있다.

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

>>> d = {'name':'bingsu', 'age':22}
>>> f'My name is {d["name"]}. Age is {d["age"]}.
'My name is bingsu. Age is 22.'

- 정렬과 공백 채우기 역시 아래와 같이 할 수 있다.

>>> f'{"hi":<10}'  # 왼쪽 정렬
'hi        '
>>> f'{"hi":>10]'  # 오른쪽 정렬
'        hi'
>>> f'{"hi":^10}'  # 가운데 정렬
'    hi    '
>>> f'{"hi":!<10}'  # 왼쪽 정렬 후 ! 문자로 공백 채우기.
'hi!!!!!!!!'

- 소수점 표현은 포맷 코드와 숫자를 같이 쓴 표현을 동일하게 사용한다.

>>> y = 3.25154234
>>> f'{y:10.4f}'  # 소수점 4자리까지 표현 후 총 자릿수를 10으로 맞춘다.
'     3.2515'

- f 문자열에서 { } 문자를 표시하려면 두 개를 동시에 사용해야 한다.

>>> f'{{ and }}'
'{ and }'

[ 문자열 관련 함수 ]

: 문자열 내장 함수를 사용하기 위해서는 문자열 변수 이름 뒤에 '.'를 붙인 다음 함수 이름을 써주면 된다.

 

- 문자 개수 세기(count): 문자열 중 특정 문자의 개수를 돌려준다.

>>> a = "hobby"
>>> a.count('b')
2

- 위치 알려주기 1(find): 특정 문자가 처음으로 나온 위치를 반환한다. 찾는 문자나 문자열이 존재하지 않는 경우 -1을 반환한다. (파이썬은 숫자를 0부터 세고, 이 위치 결과는 인덱스 값임을 알아두자.)

>>> a = "Python is the best choice"
>>> a.find('b')
14  # 문자 b가 처음 나온 위치 (15번째지만, 인덱스 값은 14.)
>>> a.find('k')
-1

- 위치 알려주기 2(index): 특정 문자가 처음으로 나온 위치를 반환하는 것은 find 함수와 동일하지만, 문자열 안에 존재하지 않는 문자를 찾으려 하면 오류가 발생한다는 점에서 차이가 있다.

 

- 문자열 삽입(join): 문자열 각각의 문자 사이에 큰따옴표 안의 구분자를 삽입해 연결하는 역할을 한다. 문자열뿐만 아니라 리스트나 튜플도 입력으로 사용할 수 있다.

>>> ",".join('abcd')
'a,b,c,d'
>>> ",".join(['a', 'b', 'c', 'd'])
'a,b,c,d'

- 소문자를 대문자로 바꾸기(upper): 문자열이 이미 대문자라면 아무 변화도 일어나지 않는다.

>>> a = "hi"
>>> a.upper()
'HI'

- 대문자를 소문자로 바꾸기(lower)

>>> a = "HI"
>>> a.lower()
'hi'

- 왼쪽 공백 지우기(lstrip): 문자열 중 가장 왼쪽에 있는 한 칸 이상의 연속된 공백들을 모두 지운다.

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

- 오른쪽 공백 지우기(rstrip): 문자열 중 가장 오른쪽에 있는 한 칸 이상의 연속된 공백들을 모두 지운다.

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

- 양쪽 공백 지우기(strip): 문자열 양쪽에 있는 한 칸 이상의 연속된 공백을 모두 지운다.

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

- 문자열 바꾸기(replace): replace(바뀌게 될 문자열, 바꿀 문자열) 꼴로 사용해 특정 값을 다른 값으로 치환한다.

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

- 문자열 나누기(split): 함수 안의 인자가 없다면 공백(스페이스, 탭, 엔터 등)을 기준으로 문자열을 나눠 준다. 괄호 안에 특정 값이 있을 경우, 괄호 안의 값을 구분자로 문자열을 나눠 준다. 이 방식으로 나눈 값은 리스트에 하나씩 들어간다.

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

소개한 문자열 관련 함수는 문자열 처리에서 사용 빈도가 높기 때문에 숙지하시면 좋습니다.

반응형
LIST

관련글 더보기

댓글 영역