🔍QA & TEST/🧑🏻‍💻Python

[Python] 자료형 : 문자(String)

siwoobyeol 2024. 7. 14. 16:38

 

문자열 (String)

연속된 문자들의 나열을 말한다.

"Life is too short, You need Python"
"a"
"123"
모든 예문이 큰따옴표(")로 둘러싸여 있다. "123"은 숫자인데 왜 문자열이지? 라는 의문이 드는 사람도 있을 것이다.
따옴표로 둘러싸여 있으면 모두 문자열이라고 보면 된다.

 

1. 큰따옴표로 양쪽 둘러싸기

"Hello World"

2. 작은따옴표로 양쪽 둘러싸기

'Python is fun'

3. 큰따옴표 3개를 연속으로 써서 양쪽 둘러싸기

"""Lefe is too short, You need python"""

4. 작은따옴표 3개를 연속으로 써서 양쪽 둘러싸기

'''Lefe is too short, You need python'''
단순함이 자랑인 파이썬이 문자열을 만드는 방법은 왜 4가지일까? 그 이유에 대해 알아보자.

문자열 안에 '나 "를 포함시키고 싶을 때

1. 문자열에 작은따옴표 포함하기

Python's favorite food is perl 문자열을 food 변수에 저장하고 싶다고 가정.

문자열 중 Python's에 작은따옴표(')가 포함되어있다.

 

이 경우에는 문자열을 큰따옴표로 둘러싸야 한다.

큰따옴표 안에 들어 있는 작은따옴표는 문자열을 나타내기 위한 기호로 인식되지 않는다.

대화형 인터프리터를 열고 다음과 같이 입력해 보자.

food = "Python's favorite food is perl"

# 'Python'으로 입력 후 실행 해보면 구문 오류(SyntaxError)가 발생한다.
>>> food = 'Python's favorite food is perl'
  File "<stdin>", line 1
    food = 'Python's favorite food is perl'
                   ^
SyntaxError: invalid syntax

2. 문자열에 큰따옴표 포함하기

큰따옴표가 포함된 문자열이라면 어떻게 해야 제대로 표현될까?

문자열을 작은따옴표로 둘러싸면 된다.

say = '"Python is very easy." he says.'
print(say)
# "Python is very easy." he says.

3. 역슬래시(\)를 사용해서 작은따옴표와 큰따옴표를 문자열에 포함하기

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

print(food) # Python's favorite food is perl 출력
print(say) # "Python is very easy." he says. 출력

여러 줄인 문자열을 변수에 대입하고 싶을 때

1. 줄을 바꾸기 위한 이스케이프 코드 \n 삽입하기

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

\n을 삽입하는 방법이 있지만, 읽기가 불편하고 줄이 길어지는 단점이 있다.

2. 연속된 작은따옴표 3개 또는 큰따옴표 3개 사용하기

# 1번 방법의 단점을 극복하기 위해 파이썬에서는 작은따옴표 3개(""") 또는 큰따옴표 3개(""")를 사용

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 널 문자
* bold처리된 위 5가지가 활용 빈도가 가장 높다.


문자열 연산하기

1. 문자열 더해서 연결하기

head = "Python"
tail = " is fun!"

print (head + tail)
# Python is fun!

2. 문자열 곱하기

일반적으로 숫자 곱하기의 의미와 다르다.

문장을 2번 반복하를 뜻이다.

a = "python"
print(a * 2)
# pythonpython

3. 문자열 곱하기를 응용하기

# multistring.py

print("=" * 50)
print("My Program")
print("=" * 50)

# ==================================================
# My Program
# ==================================================

문자열 길이 구하기

문자열의 길이는 다음과 같이 len 함수를 사용하면 구할 수 있다.

len함수는 print 함수처럼 파이썬의 기본 내장 함수로, 별다른 설정 없이 바로 사용할 수 있다.

a = "Life is too short"
print(len(a))

# 17

문자열 인덱싱과 슬라이싱

인덱싱(indexing)이란 무엇인가를 '가리킨다'

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

문자열 인덱싱

a = "Life is too short"
print(a[0]) # L
print(a[3]) # e

문자열 인덱싱 활용하기

a[-1]이 뜻하는 것은 뭘까? 눈치 빠른 독자는 이미 알아챘겠지만, 문자열을 뒤에서부터 읽기 위해 -(빼기) 기호를 붙인 것

a = "Life is too short, You need Python"
print(a[-1]) # n
print(a[-0]) # L
print(a[-2]) # o
print(a[-5]) # y

문자열 슬라이싱

"Life is too short, You need Python" 문자열에서 'Life' 또는 'You' 단어 뽑는 방법은 없을까?

a = "Life is too short, You need Python"
b = a[0] + a[1] + a[2] + a[3]
print(b) # 'Life'

print(a[0:3] # 'Lif'
# >>> 0 <= a < 3

슬라이싱으로 문자열 나누기

a = "20230331Rainy"
date = a[:8]
weather = a[8:]

print(date) # '20230331'
print(weather) # 'Rainy'

문자열 포매팅이란?

문자열에서 또 하나 알아야 할 것으로 "문자열 포매팅 (String formatting)"이 있다.

문자열 포매팅 따라 하기

1. 숫자 바로 대입

문자열 안에 정수 3을 삽입하는 방법을 보여준다.

문자열 안의 숫자를 넣고 싶은 자리에 %d 문자를 넣어 주고 삽입할 숫자 3은 가장 뒤에 있는 % 문자 다음에 써 넣었다.

%d는 '문자열 포맷 코드'라고 부른다.

"I eat %d apples." %3
# I eat 3 apples.

2. 문자열 바로 대입

문자열 안에 꼭 숫자만 넣으라는 법은 없다. 이번에는 숫자 대신 문자열을 넣어 보자.

"I eat %s apples." % "five"
# 'I eat five apples.'

3. 숫자 값을 나타내는 변수로 대입

1번처럼 숫자를 바로 대입하든, 위 예제처럼 숫자 값을 나타내는 변수를 대입하든 결과는 같다.

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

4. 2개 이상의 값 넣기

문자열 안에 1개가 아닌 여러 개의 값을 넣고 싶을때는 어떻게 해야 할까?

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.'
문자열 포맷 코드
코드 설명
%s 문자열 (String)
%c 문자 1개 (Character)
%d 정수 (Integer)
%f 부동소수 (floating-point)
%o 8진수
%x 16진수
%% Literal % (문자 % 자체)
"Error is %d%." % 98
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# ValueError: incomplete format

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

1. 정렬과 공백

>>> "%10s" % "hi"
'        hi'
# 전체 길이가 10개인 문자열 공간에서 대입되는 값을 오른쪽으로 정렬하고 그 앞의 나머지는 공백

# 왼쪽정렬을 하고 싶으면 -%10s가 될 것이다.
>>> "%-10sjane." % 'hi'
'hi        jane.'
# hi를 왼쪽으로 정렬하고 나머지는 공백으로 채웠다

2. 소수점 표현하기

"%0.4f" % 3.42134234
'3.4213' # 소수점 4자리까지만

"%10.4f" % 3.42134234
'    3.4213' # 전체길이 10개 소수점 4자리 오른쪽 정렬

format 함수를 사용한 포매팅

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

앞에서 살펴본 문자열 포매팅 예제를 format 함수를 사용해서 바꾸면 다음과 같다.

1. 숫자 바로 대입하기

{0} 부분이 숫자 3으로 바뀌었다.

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

2. 문자열 바로 대입하기

{0} 항목이 'five'라는 문자열로 바뀌었다.

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

3. 숫자 값을 가진 변수로 대입하기

{0} 항목이 number 변수의 값인 3으로 바뀌었다.

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

4. 2개 이상의 값 넣기

{0}, {1}과 같은 인덱스 항목이 format 함수의 입력값으로 순서에 맞게 바뀐다.

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

5. 이름으로 넣기

{0}, {1}과 같은 인덱스 항목 대신 더 편리한 {name} 형태를 사용하는 방법도 있다.

{name} 형태를 사용할 경우, format 함수에는 반드시 name=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.'

6. 인덱스와 이름을 혼용해서 넣기

인덱스 항목과 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.'

7. 정렬 3가지

  • 왼쪽 정렬 :<10 표현식을 사용하면 치환되는 문자열을 왼쪽으로 정렬하고 문자열의 총 자릿수를 10으로 맞출 수 있다.
  • 오른쪽 정렬 :< 대신 :>을 사용하면 된다. 화살표의 방향을 생각하면 어느 쪽으로 정렬되는지 바로 알 수 있을 것이다.
  • 가운데 정렬 :^ 사용하면 가운데 정렬도 가능하다.
# 왼쪽 정렬
>>> "{0:<10}".format("hi")
'hi        '

# 오른쪽 정렬
>>> "{0:>10}".format("hi")
'        hi'

# 가운데 정렬
>>> "{0:=^10}".format("hi")
'====hi===='
>>> "{0:!<10}".format("hi")
'hi!!!!!!!!'

8. 공백 채우기

정렬할 때 공백 문자 대신 지정한 문자 값으로 채워 넣을 수도 있다.

채워 넣을 문자 값은 정렬 문자 <, >, ^ 바로 앞에 넣어야 한다.

첫 번째 예지는 가운데(^)로 정렬하고 빈 공간을 (=)로 채웠고,

두 번째 예제는 왼쪽(<)으로 정렬하고 빈 공간을 !로 채웠다.

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

9. 소수점 표현하기

format 함수를 사용해 소수점을 4자리까지만 표현하는 방법을 보여준다.

자릿수를 10으로 맞출 수도 있다.

>>> y = 3.42134234
>>> "{0:0.4f}".format(y)
'3.4213'


>>> "{0:10.4f}".format(y)
'    3.4213'

10. { 또는 } 문자 표현하기

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

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

f 문자열 포매팅

파이썬 3.6 버전부터는 f 문자열 포매팅 기능을 사용할 수 있다. (미만은 사용 불가)

f 접두사를 붙이면 f 문자열 포매킹 기능을 사용할 수 있다.

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

f 문자열 포매팅은 위와 같이 name, age와 같은 변숫값을 생성한 후에 그 값을 참조할 수 있다.

도한 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!!!!!!!!'

소수점은 다음과 같이 표혈할 수 있다.

>>> y = 3.42134234
>>> f'{y:0.4f}'  # 소수점 4자리까지만 표현
'3.4213'
>>> f'{y:10.4f}'  # 소수점 4자리까지 표현하고 총 자리수를 10으로 맞춤
'    3.4213'

f 문자열에서 {}를 문자 그대로 표시하려면 다음과 같이 2개를 동시에 사용해야 한다.

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

문자열 관련 함수들

문자 개수 세기 - count

count 함수로 문자열 중 문자 b의 개수를 리턴했다.

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

위치 알려주기 1 - find

find 함수로 문자열 중 문자 b가 처음으로 나온 위치를 반환했다.

만약 찾는 문자나 문자열이 존재하지 않는다면 -1을 반환한다.

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

위치 알려주기 2 - index

index 함수로 문자열 중 문자 t가 맨 처음으로 나온 위치를 반환했다.

만약 찾는 문자나 문자열이 존재하지 않는다면 오류가 발생한다.

앞의 find 함수와 다른점은 문자열 안에 존재하지 않는 문자를 찾으면 오류가 발생한다는 것이다.

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

문자열 삽입 - join

join 함수로 abcd 문자열의 각각의 문자 사이에 ','를 삽입했다.

join 함수는 문자열뿐만 아니라 리스트나 튜플도 입력으로 사용할 수 있다.

join 함수의 입력으로 리스트를 사용하는 예는 다음과 같다.

>>> ",".join('abcd')
'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.split()처럼 괄호 안에 아무 값도 넣어 주지 않으면 공백(space, Tab, Enter) 기준으로 문자열을 나누어 준다.

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

 

출처 : https://wikidocs.net/13