Python - 문자열(String)

728x90

저번 포스팅에서는 기본적인 자료형과 연산자에 대해 알아보았다. 
이제는 문자열에 대해서 알아보려고 한다.

문자열은 따옴표(큰따옴표, 작은따옴표)로 감싸 져서 표현된 문자, 단어들의 묶음을 말한다. (따옴표 안에 숫자가 들어가도 자료형이 바뀌지 않는다)

문자열은 어떤 문자든 문자 자체를 그대로 출력하는데, 모든 경우에 그런 것은 아니다. 따옴표로 감싸진 문자열에서 문자가 특별하게 인식되는 경우는 총 세 가지로 나뉘는데,

  1. 따옴표 안에 같은 종류의 따옴표를 사용한 경우
  2. 이스케이프 시퀀스(Escape sequence)를 사용한 경우
  3. 문자열 포매팅을 한 경우

따옴표를 문자열로 표현하는 방법은 아래의 4가지가 있다.

  • 작은따옴표로 감싸기('문자열')
  • 큰따옴표로 감싸기("문자열")
  • 작은따옴표로 세 개로 감싸기('''문자열''')
  • 큰따옴표 세 개로 감싸기("""문자열""")

추가적으로 따옴표 세 개(""", ''')를 사용하면 명시적인 개행으로 문장을 나눌 수 있다. 이렇게 여러 방면으로 사용할 수 있는 따옴표지만 작은따옴표와 큰따옴표를 섞어 사용하면 코드의 일관성이 떨어지게 되니 프로그래밍의 생명인 일관성과 간결함을 지키기 위해 백 슬래쉬( \ )를 이용하여 따옴표를 처리하기도 한다. (이렇게 백 슬래쉬를 이용한 특정 문자를 이스케이프 시퀀스라고 얘기한다)

이스케이프 시퀀스(escape sequence)

문자열에서 표현하기 어려운 특정 문다를 백 슬래쉬(\)로 표현하는 것을 이스케이프 시퀀스라고 한다.
대표적으로 문자열을 개행하여(한 줄 띄어서) 출력하고 싶을 때 따옴표 안에 \n을 입력한다.
\n 이외에 문자열 안에서 사용할 수 있는 이스케이프 시퀀스는 아래와 같다. (자주 사용되지는 않는다)

이스케이프 시퀀스(escape sequence) 의미
\\ 백슬래시
\' 작은 따옴표
\" 큰 따옴표
\n 개행(엔터)
\b 백스페이스(글자 하나를 지운다)
\t

 

이제 문자열 연산에 대해서 알아보자!

문자열을 덧셈 부호를 이용해 연결한 것을 Concatenation이라고 한다. 문자열은 곱셈도 가능한데, 문자열 * 문자열의 형태가 아니라
"문자열 * 정수" 형태로 가능하다. 문자열의 곱셈은 문자열을 반복한다는 의미이다.

파이썬이 아닌 다른 엄격한 프로그래밍 언어를 학습했던 사람들에게는 다소 생소한 연산일 것이다. 

인덱싱과 슬라이싱

프로그래밍에서 인덱스(index)는 수많은 데이터 중 원하는 항목을 쉽게 찾도록 기록된 표기이다. 문자열은 바로 2진수로 바꿀 수 없기 때문에, 숫자와 다르게 아스키코드(ASCII CODE)를 사용한다. 아스키코드는 영문 키보드를 사용해 입력할 수 있는 모든 문자에 숫자를 매칭 시킨 표준 체계이다. 하나의 숫자는 아무리 길어도 단일 값이지만, 문자열은 각 문자마다 값을 가진다. 따라서 문자열은 하나로 보일지라도 문자마다 인덱싱이 가능하다.

이제 인덱싱에 대해 알아보자! 인덱싱은 문자열에 포함된 각 문자에 대해 순차적으로 번호를 매기는 것을 뜻한다. 예로 들어 "APPLE" 문자열을 인덱싱 하면 'A', 'P', 'P', 'L', 'E' 순서대로 0, 1, 2, 3, 4라는 인덱스를 가지게 된다. 문자열의 각 문자에 접근하기 위해 작성해야 할 코드 형식은 "변수 이름[인덱스 값]"이다. 여기서 인덱스 값은 인덱스 번호를 뜻하며 인덱스 번호는 0부터 시작한다. (문자열에서뿐만 아니라 프로그래밍에서 순서를 따질 때 모든 인덱스 값은 0부터 시작한다)

또한 파이썬에서는 인덱스는 앞에서부터 뿐만 아니라 뒤에서부터 역시 접근할 수 있다. 그저 인덱스 값에 '- (마이너스)'를 붙이면 되지만, 마지막 요소의 인덱스 값은 '-0'이 아닌 '-1'부터 시작한다. (문자열 자료형은 Immutable타입으로 한 번 초기화하면 사용자 임의로 값을 바꿀 수 없다) 

슬라이싱

슬라이싱은 단어 그대로 지정 범위만큼 데이터 요소를 잘라내는 기능이다. "변수명[첫 인덱스 번호: 마지막 인덱스 번호]" 형식으로 작성하며, 만약 ver [0:5]라고 작성하면 인덱스 값 0부터 4까지 잘라낸다. 슬라이싱할 때 앞 인덱스 숫자를 생략하게 되면 맨 처음부터, 뒤 인덱스 값을 생략하면 맨 뒤까지 범위를 지정한다. 슬라이싱 또한 인덱스 번호에 '- (마이너스) '를 붙임으로써 뒤 요소부터 접근이 가능하다. 

문자열 포매팅

'문자열 자료형'에서 따옴표로 감싸진 문자열 안에서 특별하게 인식되는 문자가 있다는 것을 앞에서 설명했었다. ( 1. 따옴표 안 따옴표, 2. 이스케이프 시퀀스 ) 이제 세 번째 경우, %를 이용한 '문자열 포매팅'을 배울 차례이다. 문자열 포매팅은 사용자가 문자열의 포맷을 지정하는 것이다. 

포맷 코드를 먼저 살펴보자

포맷 코드 설명
%s 문자열(String)
%c 문자 1개(character)
%d 정수(integer)
%f 실수/부동 소수(floating-point)
%x 16진수
%% % 자체

이제 포맷 코드 표를 이용하여 코드를 작성해보겠다.

city = "seoul"
today = 12
day = "화요일"
temperature = 26
announcement = "%s의 %d일 %s 기온은 %d도 입니다." %(city, today, day, temperature)

print("%s의 %d일 %s 기온은 %d도 입니다." %(city, today, day, temperature)) #방법1
print(announcement) #방법2

문자열 안에 %d, %s와 같은 포맷 코드를 입력한 뒤, 문자열 뒤에 %를 시작으로 변숫값을 작성한다. 그러면 앞에서 지정한 포맷부터 차례대로 변숫값이 대입된다.

*주의점

숫자형은 문자열 포맷 코드를 상요하여 표현할 수 있지만, 문자열은 숫자형 포맷 코드를 사용하여 표현할 수 없다.

%f를 사용할 때 f 앞에.(숫자)를 기록하여 소수점을 몇 자리까지 표시할 것인가 지정할 수 있다. (ex. %.2f 라고 작성한다면 소수점 둘째 자리까지 표현한다는 의미이다)

정수형은 실수형으로, 실수형을 정수형으로 포매팅 가능하다. 단, 정수형을 실수형으로 표현하면 소수점 첫째 자리 0이 붙고, 실수형을 정수형으로 표현하면 소수점 첫째 자리에서 내림 처리한다.

출력할 때 출력 폭을 지정할 수 있다. "%(폭)d" 형식으로 입력하면 자동으로 오른쪽으로 정렬되고 왼쪽에는 공백으로 채워진다. 만약 포매팅하고 싶은 요소가 숫자라면 (폭) 앞에 0을 입력하여 빈 곳을 0으로 채울 수 있다.

만약 왼쪽으로 정렬하고 싶다면 "%-(폭)d" 형식으로 입력한다.

문자열을 포매팅하는 데에는 % 키워드 말고도 format() 함수를 사용하여서도 포매팅할 수 있는데, % 키워드 포매팅보다 좀 더 세세하게 사용이 가능하다! % 문자열 포매팅은 문자열 안에서 사용한 포맷 코드와 뒤에 입력한 변수가 1대 1 대응을 해야 했다.

하지만 format() 함수는 %d 같은 포맷 대신에 "{인덱스 값}"을 사용하여 format() 함수 안의 값을 순서 상관없이 사용할 수 있다. 인덱스 값에 대해서 설명하자면, {0}은 format(요소 1, 요소 2,....) 일 때 '요소 1'의 값을 받아온다. format 함수를 이용한 포매팅 사용 형식은 "문자열. format(요소 1, 요소 2...)"이다.

format() 함수 내에서 변수를 선언하고 초기화하면 그 값을 "{변수명}" 형식으로 바로 받아올 수 있다. 물론 인덱스 값과 혼용하여 사용할 수도 있다. 아래는 변수명과 인덱스 값을 혼용한 예이다.

print("저의 이름은 {1}입니다. 
그리고 나이는 {4}살이고 키는 {0}cm입니다. 제 가장 친한 친구는 {name}입니다." .format(181.12, "김구름"
, height = 181.123, age = 25, name = "박에듀"))

 위 예시 코드처럼 앞쪽의 이름과 키는 인덱스 값을 나이와 뒤쪽의 이름은 변수명을 포매팅할 수 있다.

이전 포스팅에서 %10d와 같이 포맷 코드에 특정 값을 추가하여 출력 폭을 지정할 수 있었다. format( ) 함수에서 또한 마찬가지로 사용할 수 있다. 문자열 내에 ""{인덱스 값 or 변수:(출력형식)}" .format(요소)" 형식으로 입력하면 된다. (출력 형식)에는 다음과 같은 몇 가지가 있다.

출력 형식 설명 사용 예시
(문자)<(폭) 폭만큼 확보한 공간에 왼쪽 정렬로 포매팅 후 나머지를 문자로 채운다.

"{0:<10}".format(5)

"{0:0<10}".format(5)

"{0:x<10}".format(5)

(문자)>(폭) 폭만큼 확보한 공간에 오른쪽 정렬로 포매팅 후 나머지를 문자로 채운다.

"{0:>10}".format(5)

"{0:0>10}".format(5)

"{0:x>10}".format(5)

(문자)^(폭) 폭만큼 확보한 공간에 가운데 정렬로 포매팅 후 나머지를 문자로 채운다.

"{0:^10}".format(5)

"{0:0^10}".format(5)

"{0:x^10}".format(5)

아래의 예시 코드를 실행하면 다음과 같은 결과가 나온다.

print("{length: >10d}".format(length = 30))
# 공백문자: (공백) ,정렬: 오른쪽 정렬, 폭: 10
# 순서대로 입력해야하고 생략 가능

print("{0:0^10}".format("goorm"))
# 공백문자: 0 ,정렬: 가운데 정렬, 폭: 10
# 순서대로 입력해야하고 생략 가능

print("{height:!>13.2f}".format(height = 181.24363))
# 공백문자: ! ,정렬: 오른쪽 정렬, 폭: 13, 소수점 2자리 표시
# 순서대로 입력해야하고 생략 가능

>는 무시하자

포매팅할 때 사용하는 { , } 괄호 또한 문자열로 취급해야 할 경우가 있다. 그럴 때는 '{'(문자열)'}'에 {,}를 한번 더 추가하여 
'{{'나'}}' 처럼 2개를 연속해 사용하면 출력 가능하다! 

마지막으로 3.6 버전에서 새로 사용할 수 있게 된 f 문자열 포매팅 방식을 소개한다. 최근에 나온 만큼 매우 간단하게 사용할 수 있다.
f 문자열 포매팅은 format( ) 함수처럼 포맷 코드는 그대로 '{}'를 사용하고 문자열 앞에 f만 붙이면 쉽게 사용할 수 있다.

아래는 f 문자열 포매팅 방식의 예시 코드이다.

name = "김구름"
age = 25
height = 181.123
print(f"저의 이름은 {name}입니다. 그리고 나이는 
{age+10}살이고 키는 {height:!^10.2f)cm 입니다.")

 

문자열 함수

파이썬은 데이터를 다루는데 유용하고 직관적인 내장 함수(기본 함수)를 많이 가지고 있다. 함수는 특정 기능을 수행하기 위해 제작된 명령 묶음이며, 함수 이름과 괄호를 기본으로 구성된다. 콘솔 출력 함수 print( )는 함수 이름 print와 괄호로 구성되고, print(a)와 같이 괄호 안에 요소를 넣어 사용한다. 

이제부터 매우 유용하게 쓰이는 문자열 관련 함수에 대해 알아보겠다. 문자열 함수는 문자열 혹은 문자열 변수 뒤에 '.'을 붙인 뒤 함수를 적어 사용할 수 있다. 대부분의 함수는 어떤 기능을 하는지 이름만 들어도 알 수 있도록 직관적이다. (함수명 옆의 괄호 안에 들어가는 값을 '전달 인자'라고 한다.  전달 인자는 없을 수도 있다)

함수 설명
count() 전달 인자의 문자 개수를 변환
find() 함수의 대상이 되는 문자열에 전달 인자와 같은 문자가 있는지 찾고, 그 문자가 처음 발견된 인덱스 값을 반환. 만약 전달 인자가 문자열내에 없다면 -1 반환
index() find()와 같은 역할을 수행하나, 전달 인자가 문자열 내에 없으면 오류 발생
join()

전달 인자 사이에 함수의 대상이 되는 문자열을 삽입 
(ex. " , ".join("goorm") --> "g, o, o, r, m" )

upper() /
lower()
함수의 대상이 되는 문자열을 대문자로  / 소문자로 변환
lstrip() /
rstrip()
함수의 대상이 되는 문자열의 가장 왼쪽 / 오른쪽 공백을 모두 삭제
strip() 함수의 대상이 되는 문자열의 양쪽에 있는 한 칸 이상의 공백 모두 
삭제
replace() replace(전달 인자1 , 전달 인자2) 형식으로 사용하며, 함수의 대상이 되는 문자열에서 전달 인자1과 동일한 부분을 찾아 전달 인자2로 교체
split() 함수의 대상이 되는 문자열을 전달 인자 기준으로 쪼개 리스트로 반환
(ex. "g ! oo ! rm".split(" ! ") --> ['g','oo','rm'])

 (split() 설명에서 나온 리스트는 추후에 포스팅할 예정이다. 간단하게 설명하면 리스트는 여러 요소들을 모아놓은 묶음이다)

앞에서 언급한 것처럼 함수는 "변수 이름(혹은 문자열 자체).함수()" 형태로 작성하여 사용한다. 그러나 꼭 .함수() 형태로 작성하여 사용한다. 그러나 꼭 .함수() 형태만이 유용하게 쓰이는 것이 아니다. 데이터를 처리할 때 단순한 print() 함수와 같은 형태인 len() 함수는 프로그래밍에서 꽤 자주 쓰이는 중요한 함수이다. 이 함수는 문자열 말고도 여러 값이 모여있는 자료형의 길이를 반환하는 함수이다.
"len(변수 혹은 값 자체)" 형태로 사용한다.

다음 포스트는 '리스트'에 대한 공부를 진행할 예정이다.

728x90

'프로그래밍 공부 > Python' 카테고리의 다른 글

Python - 기본적인 자료형과 연산자  (0) 2019.11.23
Python - 변수와 콘솔 출력 함수  (0) 2019.11.22
Python - 조건문  (0) 2019.11.22
Python - 반복문  (0) 2019.11.22
파이썬(Python)이란?  (0) 2019.11.22