스터디/파이썬 스터디 강의자료

[3팀/이지현] 6차시 파이썬 스터디 - 문자열

알 수 없는 사용자 2023. 5. 4. 12:52

6차시_문자열_강의안.pdf
0.54MB
6차시_문자열_과제.pdf
0.22MB

본 강의 자료는 데이터 과학을 위한 파이썬 프로그래밍/최성철을 참고

하여 제작하였습니다.

🖋️ 문자열의 이해

문자열의 개념

문자열(string)은 애플리케이션을 만들거나 데이터를 분석할 때 매우 중요하게 다루어지는 자료형 중에 하나입니다. 문자열은 리스트와 같이 데이터를 순차적으로 메모리에 저장하는 형식인 시퀀스 자료형입니다.

문자열의 인덱싱

앞에서 문자열은 시퀀스 자료형이라고 설명하였는데요. 따라서 문자열의 특징 중 하나가 바로 인덱싱입니다. 리스트처럼 글자 하나하나가 상대적인 주소를 가지는데요, 이 주소를 사용해 저장된 값을 가져오는 인덱싱을 사용할 수 있습니다. 즉, 아래와 같이 문자열의 처리가 가능합니다.

실제 코드에서는 다음과 같이 사용합니다.

>>> a = "abcde"
>>> print(a[0], a[4])
a e
>>> print(a[-1], a[-5])
e a

코드를 해석하면 변수 a에 값 abcde가 들어있을 때, a[0], 즉 a의 0번째 값으로 a가 출력됩니다. 그리고 마찬가지로 a의 4번째 값으로 e가 출력됩니다. 역순으로도 인덱싱을 할 수 있습니다.

문자열의 슬라이싱

슬라이싱은 문자열의 주소값을 이용해 문자열의 부분값을 추출해내는 기법입니다.

>>> a = "TEAMLAB MOOC, AWESOME Python"
>>> print(a[0:6], " AND ", a[-9:]) 
TEAMLA AND ME Python
>>> print(a[:])
TEAMLAB MOOC, AWESOME Python
>>> print(a[-50:50])      # 범위를 넘어갈 경우 자동으로 최대 범위를 지정
TEAMLAB MOOC, AWESOME Python
>>> print(a[::2], " AND ", a[::-l])
TALBMO,AEOEPto AND nohtyP EMOSEWA ,C00M BALMAET

두 번째 줄은 일반적인 인덱스로 구간을 나누는 것입니다. a[0:6]은 0번째 인덱스부터 5번째 인덱스 까지를 뜻하며, a[-9:]은 -9번째 인덱스부터 끝까지를 뜻합니다.

리스트와 마찬가지로 문자열도 맨 마지막 글자의 인덱스가 -1부터 시작합니다. 네 번째 줄의 a[:]처럼 아예 인덱스 번호를 넣지 않거나, a[-50:50]처럼 인덱스 범위를 벗어나도 결과는 정상적으로 출력됩니다.

이 슬라이싱은 ‘변수[시작 인덱스:종료 인덱스:증가값]’과 같은 형태로 사용합니다. 따라서 8번째 줄의 a[::2]는 처음부터 끝까지 두 글자씩 띄어서 출력하고, a[::-1]은 글자의 역순으로 출력한다는 의미입니다.

문자열의 연산

문자열도 일반적인 변수와 마찬가지로 연산이 가능합니다. 기본적으로 문자열의 연산은 리스트 연산과 같습니다.

>>> a = "TEAM"
>>> b = "LAB"
>>> print(a + "" + b)            # 덧셈으로 a와 b 변수 연결하기
TEAM LAB
>>> print(a * 2 + "" + b * 2)    # 곱하기로 반복 연산 가능
TEAMTEAM LABLAB
>>> if 'A' in a: print(a)        # 'A'가 a에 포함되었는지 확인
... else: print(b)
...
TEAM

세 번째 줄은 문자열의 덧셈 연산입니다. 덧셈 연산은 모든 변수가 문자열일 경우 텍스트 붙이기가 이루어집니다.

여기서 자주 하는 실수 중 하나가 print( ) 함수에서 정수형과 문자열을 같이 보여주려고 할 때 발생하는데요. 예를 들어, 다음과 같이 코드를 작성하면 덧셈 연산이 실행되지 않습니다.

>>> int_value = 2
>>> print("결과는" + int_value)

다섯 번째 줄은 문자열의 곱셈 연산입니다. a * 2를 풀면 a + a의 연산이므로, 같은 글자가 두 번 출력됩니다.

일곱 번째 줄에서는 포함 여부를 확인하는 in 연산을 합니다. 흔히 if문과 함께 사용하는데요, 특정 문자가 특정 변수에 들어있는지 확인하는 연산입니다.

문자열 함수

문자열 함수는 문자열을 다룰 때 사용하기 유용한 함수입니다.

함수명 기능

len( ) 문자열의 문자 개수를 반환
join( ) 리스트를 문자열로 합쳐서 반환
upper( ) 대문자로 변환
lower( ) 소문자로 변환
title( ) 각 단어의 앞글자만 대문자로 변환
capitalize( ) 첫 문자를 대문자로 변환
count(’찾을 문자열’) ‘찾을 문자열’이 몇 개 들어있는지 개수 변환
find(’찾을 문자열’) ‘찾을 문자열’이 왼쪽 끝부터 시작하여 몇 번째에 있는지 변환
rfind(’찾을 문자열’) find( ) 함수와 반대로 ‘찾을 문자열’이 오른쪽 끝부터 시작하여 몇 번째에 있는지 반환
startswith(’찾을 문자열’) ‘찾을 문자열’로 시작하는지 여부 반환
endswith(’찾을 문자열’) ‘찾을 문자열’로 끝나는지 여부 반환
strip( ) 좌우 공백 삭제
rstrip( ) 오른쪽 공백 삭제
lstrip( ) 왼쪽 공백 삭제
split( ) 문자열을 공백이나 다른 문자로 나누어 리스트로 변환
isdigit( ) 문자열이 숫자인지 여부 반환
islower( ) 문자열이 소문자인지 여부 반환
isupper( ) 문자열이 대문자인지 여부 반환

🖋️ 단어 카운팅 프로그램 만들어보기

프로그램 내용

앞에서 배운 문자열의 여러 기능을 사용하여 단어 카운팅 프로그램을 만들어 봅시다. 코드를 짤 프로그램은 비틀스의 <Yesterday>라는 노래에서 ‘Yesterday’라는 단어가 몇 번 나오는지 맞히는 단어 카운팅 프로그램입니다. 우선 해당 가사는 소스파일 폴더에 있는 yesterday, txt라는 이름으로 저장해주세요. ‘yesterday, txt’ 파일의 내용을 파이썬에서 읽어오기 위해서는 파일 핸들링 코드를 이용해야 합니다. 아직 배우지 않은 내용이므로 아래 코드를 그대로 입력해주세요. 그러면 리스트 형태로 각 줄의 내용을 가져올 수 있습니다.

f = open("yesterday.txt", 'r')
yesterday_lyric = f.readlines()
f.close()

(+ open은 파일을 열기 위한 함수이고, 파일에 대한 정보는 변수 f에 저장하는 것입니다. f.readlines()는 파일 안의 내용을 리스트 형태로 반환하는 함수입니다.)

프로그램 실행 결과

Number of a Word 'Yesterday' 9

프로그램을 작성하기 위해 실행 결과를 기반으로 어떤 코드가 필요한지 확인하고, 파이썬을 이용하여 단어 카운팅 프로그램을 작성해봅시다.

문제 해결하기

f = open("yesterday.txt", 'r')
yesterday_lyric = f.readlines()
f.close()

contents = ""
for line in yesterday_lyric:
    contents = contents + line.strip() + "\\n"

n_of_yesterday = contents.upper().count("YESTERDAY")
print("Number of a Word 'Yesterday'", n_of_yesterday)

단어 카운팅 프로그랭의 코드입니다. 코드를 해석해볼까요?

우선 1 〜 3행에서는 위에서 설명드렸던 코드로 ‘yesterday.txt’ 파일의 모든 내용을 불러와 yesterday_lyric 리스트에 저장합니다.

5〜7행에서는 for문을 사용하여 yesterday_lyric 리스트의 내용을 한 줄씩 불러오면서 contents 변수에 저장합니다. 그러면 contents 변수에는 <yesterday> 노래의 모든 가사가 저장됩니다.

9〜10행에서는 upper() 함수를 사용하여 contents 변수에 있는 모든 값을 대문자로 변환 한 후, count( ) 함수를 사용하여 대문자 ‘YESTERDAY’가 몇 개인지를 확인합니다.

그 결과는 n_of_yesterday 변수에 저장되고 그 값을 print() 함수로 출력합니다.

🖋️ 문자열 서식 지정

서식 지정의 개념

print() 함수는 기본적으로 변수 또는 값을 콤마(,)로 띄어쓰기 하여 출력합니다. 하지만 print() 함수를 사용하다 보면 특정한 형식에 맞추어 결과를 출력해야 하는 경우도 발생하는데요. 특히 엑셀을 사용할 때 통화 단위, 세 자리 숫자 단위로 띄어쓰기, % 출력 등 다양한 형식에 맞추어 출력할 일이 생기는데, 이를 서식 지정(formatting)이라고 합니다. 출력 형식을 맞추기 위하 여 문자열을 print() 함수와 함께 어떻게 사용하는지 알아봅시다.

% 서식과 format( )함수

문자열의 서식을 설정할 때 print() 함수는 기본적인 출력 형식 외에 % 서식format() 함수를 구문으로 사용하여 출력 양식을 지정할 수 있습니다.

print(1, 2, 3)
print("a"+" "+"b"+" "+"c")
print("%d %d %d" %(1, 2, 3))
print("{} {} {}".format("a", "b", "c"))
1 2 3
a b c
1 2 3
a b c

1〜2행은 별도의 서식 지정 없이 그대로 print() 함수를 사용한 것이고, 3〜4행은 % 서식 지정과 format() 함수를 사용한 것입니다.

직관적으로 이해할 수 있겠지만, 3〜4행과 같은 구문을 사용할 경우 뒤에 있는 숫자와 문자들이 앞의 서식 지정 코드에 대응되어 할당됩니다. 즉, 3행의 "%d %d %d" % (1, 2, 3)에서 1, 2, 3이 각각 첫 %d부터 차례로 대응되어 할당되는 것입니다. 4행에서도 “{} {} {}”.format(”a”, “b”, “c”)에서 아무것도 적혀있지 않은 {} 공간에 “a”, “b”, “c”라는 문자열 형태의 값 3개가 각각 대응되어 출력됩니다.

이런 식으로 서식을 지정하여 출력하면 어떤 장점이 있을까요?

첫째, 데이터와 출력 형식을 분류할 수 있습니다. 같은 내용을 여러 번 반복하기 위해 기존 print() 문에 Spacebar를 이용해 띄어쓰기를 넣어 + 기호로 문자열 형태를 붙여주는 것보다 시각적으로 훨씬 이해하기 쉽게 코드를 작성할 수 있습니다. 둘째, 데이터를 형식에 따라 다르게 표현할 수 있습니다. 아래의 코드를 보면 문자열 형태인 (’one', 'two') 구문과 정수형인 (1, 2)구문이 각각 %s와 %d로 다르게 지정되어 있는데요. 서식 지정 기능은 각 변수의 자료형에 맞게 서로 다르게 지정할 수 있습니다.

print('%s %s'%('one', 'two'))
print('%d %d'%(1, 2))
one two
1 2

1. % 서식

  1. % 서식 알아보기

% 서식은 다음과 같은 형태로 사용합니다.

“%자료형” %(값)

  1. 자료형에 따라서 % 서식 설정하기
print("I eat %d apples."%3)
print("I eat %s apples."%"five")
I eat 3 apples.
I eat five apples.

위 코드에서 먼저 알아야 하는 코드는 %d와 %s인데요. %d는 정수형의 변수를, %s는 문자열의 변수를 할당받을 수 있습니다. 즉, %d에는 ‘3’이. %s에는 ‘five’가 대응되는 것입니다.

변수의 자료형에 따라서 아래의 표와 같이 다양하게 설정할 수 있습니다.

서식 설명

%s 문자열(string)
%c 문자 1개(character)
%d 정수(integer)
%f 실수(floating-point)
%o 8진수
%x 16진수
%% 문자 % 자체
  1. 1개 이상의 값 설정하기

% 서식은 1개 이상의 값도 할당할 수 있습니다. 아래의 코드처럼 % 뒤에 괄호를 넣어서 그 안에 순서대로 값을 입력하면 됩니다.

>>>print("Product:%s, Price per unit:%f."%("Apple", 5.243))
Product: Apple, Price per unit: 5.243000.
  1. 변수명을 넣어서 실행하기

직접 값을 넣지 않고 number과 day 같은 변수명을 넣어도 문제없이 실행됩니다. 아래의 코드를 실행하면 3과 three가 각각 첫 번째 자리 %d와 두 번째 자리 %s에 들어가게 됩니다.

number = 3
day = "three"
print("I ate %d apples. I was sick for %s days."%(number, day))
I ate 3 apples. I was sick for three days.

2. format()함수

  1. format() 함수 알아보기

format() 함수는 다음과 같은 형태로 사용합니다.

“{자료형}”.format(인수)

% 서식과 사용법이 거의 같지만, 문자열 형태의 인수를 사용한다는 차이점 이 있습니다.

  1. format() 함수 사용하기

다음 코드는 format() 함수를 사용한 가장 기본적인 표현 형태로, 숫자 20이 {0}에 할당되어 출력됩니다. 기존 % 서식과 비교하면 자료형을 바로 지정해주지 않고 순서대로 변수가 할당된다는 장점이 있습니다.

>>> print("I'm {0} years old.".format(20))
I'm 20 years old.
  1. 변수명을 넣어서 실행하기

또한, format() 함수는 % 서식처럼 변수의 이름을 사용하거나 변수의 자료형을 따로 지정하여 출력합니다.

age = 40; name = 'Sungchul Choi'
print("I'm {0} years old.".format(age))
print("My name is {0} and {1} years old.".format(name, age))
print("Product: {0}, Price per unit: {1:.2f}.".format("Apple", 5.243))
I'm 40 years old.
My name is Sungchul Choi and 40 years old.
Product: Apple, Price per unit: 5.24.

다른 코드들은 기존 % 서식과 비슷하지만, 4행의 Price per unit: {1:.2f}를 보면 기존 format() 함수의 쓰임과 다르게 .2f라는 구문이 추가되었는데요. 이 코드는 % 서식에서 실수형을 표현하는 기법과 같으며, .2는 소수점 둘째 자리까지 출력하라는 뜻입니다.

패딩

파이썬의 서식 지정 기능에는 여유 공간을 지정하여 글자 배열을 맞추고 소수점 자릿수를 맞추는 패딩(padding) 기능이 있습니다. % 서식과 format() 함수 모두 패딩 기능을 제공합니다.

  1. % 서식의 패딩
>>> print("%10d"%12)
        12
>>> print("%-10d"%12)
12

첫 번째 줄의 print("%10d" % 12)는 10자리의 공간을 확보하고, 우측 정렬로 12를 출력하라는 명령입니다. 기본 정렬이 우측 정렬이므로 좌측에서 아홉 번째 칸부터 12가 출력됩니다. 좌측 정렬을 하기 위해서는 세 번째 줄처럼 - 부호를 붙이면 됩니다.

실수에서도 아래와 같이 자릿수와 소수점 자릿수를 지정할 수 있습니다.

>>> print("%10.3f" % 5.94343)   # 10자리를 확보하고 소수점 셋째 자리까지 출
    5.943
>>> print("%10.2f" % 5.94343)   # 10자리를 확보하고 소수점 둘째 자리까지 출력
      5.94
>>> print("%-10.2f" % 5.94343)
5.94

첫 번째 줄의 print("%10.3f" % 5.94343)은 10자리의 공간을 확보하고 소수점 셋째 자리까지 출력하라는 뜻입니다. 이때 10자리 안에는 소수점이 포함됩니다. 역시 우측 정렬 기준이며, 좌측 정렬을 하기 위해서는 - 부호를 붙이면 됩니다.

  1. format() 함수의 패딩
>>> print("{0:>10s}".format("Apple"))
     Apple
>>> print("{0:<10s}".format("Apple"))
Apple

첫 번째 줄의 print("{0:>10s".format(’Apple"))은 10자리의 공간을 확보하고, 우측 정렬로 문자열 ‘Apple’을 출력하라는 명령입니다. 좌측 정렬을 하기 위해서는 ‘{0:<10s}’처럼 < 부호를 사용하면 됩니다.

실수에서도 자릿수와 소수점 자릿수를 지정할 수 있습니다.

>>> "{l:>10.5f}.".format("Apple", 5.243)
'  5.24300.'
>>> "{l:<10.5f}.".format("Apple", 5.243) 
'5.24300  .'

첫 번째 줄의 "{1:>10.5f}.”.format("Apple", 5.243)을 입력하면, 10자리의 공간을 확보하고, 소수점 다섯 번째 자리까지 실수를 출력합니다. 이때 10자리 안에는 소수점이 포함됩니다. 역시 우측 정렬 기준이며, 좌측 정렬을 위해서는 < 부호를 사용합니다.