이번 포스팅에서는 자료형 소개 포스팅에서 간단하게 살펴보았던 문자열(String)에 대해서 자세히 알아보도록 하겠습니다.

문자열 자료형

문자열이란 말 그대로 문자, 글자, 단어 등으로 구성된 형태를 지칭합니다. Python이 아닌 다른 언어에서는 문자와 문자열을 구분하기도 하는데 파이썬에서는 구분없이 모두 문자열이라고 합니다.

문자열 만드는 방법

Python
"Words is string."
'abc'
"10"
'10.1'
"!@#"
'''abc''' #홑따옴표(작은따옴표) 3개
"""bcd""" #쌍따옴표(큰따옴표) 3개

위에 나열한 것들은 모두 문자열입니다. 문자열이 한줄로 표현될 때는 홑따옴표 혹은 쌍따옴표를 사용하고 여러줄인 경우에는 아래와 같이 홑따옴표3개 혹은 쌍따옴표 3개를 사용해서 표현할 수 있습니다.

Python
str = """
안녕하세요
두줄짜리 데이터입니다.
여러줄을 한번에 작성합니다.
"""

위에서 소개한 것처럼 문자열을 만드는 방법은 4가지 방법이 있습니다.

1. 쌍따옴표로 양쪽을 감싸기

Python
"Python"

2. 홑따옴표로 양쪽을 감싸기

Python
'Python'

3. 쌍따옴표를 3개 연속써서 양쪽을 감싸기

Python
"""Python"""

4. 홑따옴표를 3개 연속써서 양쪽을 감싸기

Python
'''Python'''

왜 똑같은 생성방법이 이렇게 다양한걸까요? 이유가 몇가지 있습니다.

우선 위에서 따옴표를 통해서 만들어낸 문자열은 Python 이라는 단어였습니다. 그런데 단어 안에 따옴표가 들어있는 것을 문자열로 만들고 싶다면? Py’thon 을 문자열로 만들고 싶다면 아래와 같이 입력하겠죠.

Python
'Py'thon'

이쯤에서 느낌이 오신 분도 있을 겁니다. 문자열을 만드는 과정에서는 이렇게 예상하지 못한 경우들이 존재할 겁니다. 위 처럼 코드를 치면 Py라는 문자열이 만들어지다가 뒤에 붙은 형식이 파괴된 글자들(thon’)때문에 에러가 발생하게 됩니다. 이런 경우에 필요한 게 쌍따옴표 입니다.

Python
"Py'thon"

쌍따옴표 안에 들어가는 홑따옴표는 하나의 문자로 인식하게 되서 에러가 발생하지 않습니다. 반대로 쌍따옴표가 포함된 문자열이라면 홑따옴표로 둘러싸면 됩니다.

이렇게 따옴표를 문자열에 포함시키기 위해서 2가지(쌍따옴표,홑따옴표)의 방식을 제공하게 된 것이고, 경우에 따라서는 이미 겉에 따옴표로 감싸고 있는 경우도 생길 수 있어서 다른 방법도 제공하고 있습니다. 예를 보여드릴께요.

Python
skills = 'programming\'s skill is very difficult.'
mom = "\"Hurry up!\" mom said."

위처럼 따옴표를 문자열에 포함시키는 방법으로 역슬래시(\)를 사용하는 방법이 있습니다. 이는 escape 코드의 특징을 사용하는 것인데 특수문자를 미리 정의해둔 문자조합으로 표현하는 방법 중에 하나입니다.

다음은 Escape Code 중에 자주 사용하는 코드입니다.

codedescription
\n개행문자, 다음줄의 처음으로 줄바꿈함 (Unix계열에서는 \n 만으로 \r의 기능도 수행)
\r개행문자, 커서를 그 줄의 맨 앞으로 이동시킴 (mac 계열에서는 \r 만으로 \n의 기능도 수행)
\”쌍따옴표를 출력 (쌍따옴표 안에서 쌍다옴표를 쓰고 싶을때 씀)
\’홑따옴표를 출력 (홑따옴표 안에서 홑따옴표를 쓰고 싶을때 씀)
\000Null 문자 (공백문자)
\t문자열 사이에 탭 간격을 줄때 사용
\\\ 를 그대로 표현할 때 사용

위의 코드 중에서 \n, \t, \’, \””, \\ 정도가 많이 사용되고, 나머지는 별로 사용되지 않습니다.

Print() 함수 소개

print 함수는 데이터를 출력하는 데에 사용됩니다. 위에서 문자열을 만들고 어떻게 결과로 나오는지 확인할 때 사용하면 됩니다. print 함수의 사용 예는 아래와 같습니다.

Python
>>> a = 10
>>> print(a)
10
>>> a = "Marines"
>>> print(a)
Marines

위와 같이 변수에 값을 넣고, 변수에 어떤 값이 들어있는지 확인할 때 사용하면 됩니다. 다른 출력방식도 한번 살펴보도록 하죠.

Python
>>> print("My" "School" "is" "very good")
MySchoolisvery good
>>> print("My"+"School"+"is"+"very good")
MySchoolisvery good

위의 예시처럼 따옴표로 둘러싸인 문자열은 +연산을 하는 것과 동일합니다. 문자열들 사이마다 공백을 넣어서 구분하고 싶다면 아래 예시처럼 사이에 쉼표(,)를 넣어주면 됩니다.

Python
>>> print("My", "School", "is", "very good")
My School is very good

문자열 연산방법

수학에서 사칙연산(+,-,*,/)이라는 게 있는데 프로그래밍에서는 문자열도 연산이 가능합니다. 위에 print 함수를 설명하면서 + 연산을 사용했는데, 이렇게 +는 문자열을 합치는데 사용합니다.

Python
>>> a = "Hello"
>>> b = " World"
>>> c = a + b
>>> print(c)
Hello World

그러면 곱하기는 어떻게 동작할까요?

숫자가 아닌데 곱하기를 한다는 게 이상하다고 생각할 수 있지만, 문자열에서 곱하기(*)는 반복한다는 의미입니다. 다른 언어에서는 없는 개념이라 파이썬만의 장점이라고 봐도 좋겠습니다.

Python
>>> a = "Hello"
>>> print(a*2)
HelloHello

문자열의 길이 구하기

문자열을 다룰때 정말 많이 사용하는 기능입니다. print 처럼 이미 정의되어있는 len 이라는 내장함수를 사용합니다. 공백도 하나의 문자로 취급하기 때문에 아래 예시를 보면 바로 알겁니다.

Python
>>> a = "Hello World"
>>> len(a)
11

문자열의 순서와 잘라내기

문자열에서 순서란 Index를 의미합니다. 예를 들어 “Hello”라는 문자에서 3번째 글자는 “l”입니다. 이렇게 순서를 지칭하는게 Indexing 이라고 합니다. 여기서 모든 언어가 가지는 특징이 있는데 현실세계에서는 “Hello”에서 “H”를 지칭할때 1번째 글자라고 하는데, 컴퓨터는 0부터 시작한다는 점입니다.

모든 Index는 0에서 시작합니다. 그래서 0번째 글자는 “H”, 1번째 글자는 “e”가 됩니다.

Helloworld
012345678910
Python
>>> a = "Hello world"
>>> a[8]
'r'
>>> a[3]
'l'
>>> a[-2]
'l'

위의 예시처럼 변수 뒤에 대괄호([])에 index번호를 넣으면 해당하는 문자를 지칭하게 됩니다. 그런데 음수는 이해가 안될 겁니다. -2번째 라는 의미일텐데 이는 뒤에서부터 2번째라는 뜻입니다. 그래서 “l”이 뒤에서 2번째 문자라는거죠. a[-1]의 값은 “d” 입니다.

문자열을 한 글자씩 뽑아낼때는 위와 같은 방법을 사용하면 되겠지만 “0번째부터 4번째까지”처럼 범위를 지정하는 방법도 있습니다. 이는 다른 언어에서는 substring, substr 등으로 불리는 함수를 사용하기도 합니다. 파이썬에서는 별도의 함수 없이 동작합니다. 예를 들어볼께요.

Python
>>> a = "Hello world"
>>> b = a[0:2] 
>>> print(b)
'He'
>>> b = a[0:5]
>>> print(b)
'Hello'
>>> b = a[6:] #6번째부터 마지막까지
>>> print(b)
'world'
>>> b = a[:5] #처음부터 5번째까지
>>> print(b)
'Hello'

위의 예시를 보면 알겠지만 0번째부터 2번째까지의 문자를 추출한다고 하면 0,1 번째까지 추출하고 2번째는 포함하지 않습니다. 처음에는 0의 개념이나 index의 개념이 헷갈릴 수도 있지만 빨리 익숙해져야 합니다.

문자열 템플릿처럼 다루기(Formatting)

문자열에서 자주 사용되는 방법 중에 Formatting 이라는 게 있습니다. 반복되는 형태는 어떻게든 편하게 방법이 있는 법. 이해하기 쉽게 예를 들어보겠습니다.

프로그램이 시작될 때 “Loading 38%…..” 라는 문구가 있다고 합시다. 이때 변하는 부분은 숫자만 변경된다고 하면 문자 부분은 고정을 해도 됩니다. 이럴때 Formatting 이라는 방법이 사용됩니다. 코드로 보여드리겠습니다.

Python
>>> progress = 1
>>> a = "Loading %d%%....." % progress
>>> print(a)
'Loading 1%.....'
>>> status = "Completed"
>>> b = "Loading %s"% status
>>> print(b)
'Loading Completed'

위의 예시처럼 지정된 형태에 숫자 혹은 문자를 삽입하는 방법입니다. 물론 이런 방식이 아니라 +연산자를 사용해서 만들 수도 있지만 상황에 따라서 자주 활용되는 방법 중에 하나입니다.

잘 보면 %d라고 된 부분에 값이 치환되기도 하고 %s라고 쓰기도 했습니다. 파이썬에서는 자료형에 자유로운 편이라고 했었지만 Formatting을 할때는 이렇게 어떤 데이터 타입인지 표시해줘야합니다. 그리고 %를 사용하는 표현방식에서 실제로 “%”라는 문자를 출력해야 할때는 따옴표를 \” 라고 표현했던 것처럼 ‘%%’ 라고 해줘야 하는 규칙이 있습니다.

codedescription
%s문자열(string)
%c문자(char)
%d정수(Integer) / Decimal의 약자인듯
%f실수(Float)
%o8진수
%x16진수
%%문자 % 출력

위의 표처럼 형태에 맞는 Format Code를 넣어줘야 하는데, 파이썬의 장점이 이렇게 무너지면 안된다고 생각했는지 %s 는 모든 자료형을 허용하도록 동작합니다. 문자가 아닌 숫자가 입력되어도 오류가 안 난다는 의미입니다. 다른 %d, %f 같은 경우는 다른 자료형. 즉 문자열같은 게 들어오면 에러가 발생합니다.

자리수와 공백처리

위 표에서 문자열은 %s 라고 했습니다. 여기에도 추가적인 기능이 있는데 %{자리수}s 라고 쓰면 자리수만큼 공백을 포함한 문자열을 만들어줍니다. 예를 들어 보겠습니다.

Python
>>> "%5s" % "A"
'    A'
>>> "%3s" % "BC"
' BC'
>>> "%-5s" % "A"
'A    '

%5s를 사용하면 전체 길이가 5이고 오른쪽 정렬로 값을 넣어주고 나머지 공간은 공백으로 처리해줍니다. 여기서도 -(마이너스) indexing이 가능한데, %-5s 라고 하면 좌측정렬로 값이 들어가게 됩니다.

실수(Float) 소수점 표현

만약에 소숫점이 10자리인 실수값에서 값의 변화없이 2자리까지만 표현하고 싶을 때, 이런 Formatting을 사용하면 좋습니다. 숫자를 나눠서 값을 가질 수도 있겠지만 출력할 때 요약만 하고 싶은거 라면 “%f”의 기능을 사용합니다.

예를 들어 2자리 소수점까지 표현한다고 하면 “%.2f” 이렇게 표현합니다.

Python
>>> "%0.2f" % 1.123456789
'1.12'
>>> "%.3f" % 9.123456789
'9.123'
>>> "%6.3f" % 9.123456789
' 9.123'

%s 와 동일하게 전체 자리수를 지정할 수도 있는데, “%5f”라고 한다면 5자리 실수를 표현하게 됩니다. 이때 소수점(.)도 포함한 길이가 됩니다. 예시를 들었던 “%6.3f” 의 경우는 총 6자리인데 그 중에 소수점은 3자리까지만 표현하고 남은 공간은 공백으로 채운다는 의미입니다.

여러개의 값을 대입하기

위의 예제에서는 1개의 값을 대입했는데, 한번에 2개 이상의 값을 대입할 수도 있습니다. 아래의 예를 봅시다.

Python
>>> count = 3
>>> name = "marines"
>>> "%s have %d books." % (marines, count)
'marines have 3 books.'

format() 함수를 이용한 Formatting방법 알아보기

지금까지 formatting 방식에 대해서 알아보았는데, 문자열의 format함수를 사용하면 더 편하게 많은 기능을 사용할 수 있습니다. 위에 설명한 내용들을 format함수로 사용하는 방법을 보여드리겠습니다.

값 대입하기

Python
>>> "I have {0} books.".format(5) # 숫자 대입하기
'I have 5 books.'
>>> "I have {0} books.".format("five") # 문자열 대입하기
'I have five books.'
>>> "I have {0} books. and {1} pencils.".format(4,6)
'I have 4 books. and 6 pencils.'

위와 같이 문자열 {0}, {1} 과 같은 인덱스에 맞춰서 입력값이 순서대로 대입됩니다. 순서대로 대입하는게 번거롭다고 생각이 된다면 Key=Value 형태의 대입방법도 있습니다. 이렇게 사용할때는 순서와 무관하게 key값에 맞춰서 대입이 됩니다.

Key 이름으로 대입

Python
>>> "I have {book_count} books. and {pencil_count} pencils.".format(pencil_count=3,book_count=2)
'I have 2 books. and 3 pencils.'

정렬하기

Python
>>> "{0:<8}".format("hello")
'hello   '

:<8 표현식을 사용하면 입력한 문자열을 좌측정렬하고 나머지는 공백문자로 채워 총 자리수를 8자리로 맞춰줍니다. 당연히 우측정렬(:>), 중앙정렬(:^)의 방법도 있습니다.

Python
>>> "{0:>8}".format("hello")
'   hello'
>>> "{0:^8}".format("hello")
'  hello '

공백을 채우는 문자열 지정하기

Python
>>> "{0:=^10}".format("aa")
'====aa===='
>>> "{0:=<10}".format("aa")
'aa========'

특정 문자로 채우는 것은 물론 정렬에 대한 표현식도 동일하게 적용됩니다.

소숫점 표현하기

위에서 설명했던 “%.4f” 같은 표현식도 사용가능합니다.

Python
>>> "{0:0.4f}".format(3.4132134414)
'3.4132'

f 문자열 Formatting (python 3.6+)

파이썬 3.6에서 새로 생긴 기능으로 변수를 바로 Formatting에 사용할 수 있는 방법입니다. 또한 위에서 설명했던 다양한 표현식들을 지원합니다.

Python
>>> book = '수학책'
>>> count = 5
>>> f'내가 가지고 있는 책은 {book}입니다. 총 {count}권 가지고 있습니다.'
'내가 가지고 있는 책은 수학책입니다. 총 5권 가지고 있습니다.'

위와 같이 변수명을 직접 참조할 수 있고, 아래와 같은 변수의 변형이나 참조가 가능합니다.

Python
>>> count = 5
>>> f'나는 책이 {count+1}권 있다.'
'나는 책이 6권 있다.'
>>> obj = {'book':'수학책', 'count':1}
>>> f'내가 가지고 있는 책은 {obj["book"]}입니다. 총 {obj["count"]+3}권 가지고 있습니다.'
'내가 가지고 있는 책은 수학책입니다. 총 4권 가지고 있습니다.'

위에 예시처럼 Dictionary같은 데이터 형태도 참조가 가능합니다. (따옴표가 같은 걸 사용하지 않도록 조심)

Python
>>> a = 1.23456789
>>> f'{a:0.2f}'   # 소숫점 2자리까지 표현
'1.23'
>>> f'{a:5.2f}'  # 소숫점 2자리까지 표현하고 자리수를 5자리로 맞춤
' 1.23'

>>> f'{"aa":<10}' #왼쪽 정렬
'aa        '
>>> f'{"aa":>10}' #우쪽 정렬
'        aa'
>>> f'{"aa":^10}' #가운데 정렬
'    aa    '
>>> f'{"aa":=^10}' #가운데 정렬하고 공백을 = 문자로 채움
'====aa===='

문자열 관련 함수 알아보기

이후에 함수에 대해서도 설명할텐데, 파이썬 내부에 이미 정의되어 있는 함수를 내장함수 라고 부릅니다.

count

문자열 값에서 특정 문자가 몇개 있는지 확인하는 함수입니다.

Python
>>> a  = "computer"
>>> a.count('c')
1

find

문자열의 특정 문자의 위치값을 알아내는 함수입니다. 찾는 문자가 없을 경우에는 -1을 반환합니다. 여기서도 첫번째는 0부터 시작합니다.

Python
>>> a = "computer"
>>> a.find('p')
3
>>> a.find('b')
-1

index

위 find 함수와 같은 기능을 하지만 다른 점은 찾는 문자가 없다면 오류가 발생한다는 점입니다.

join

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

join 함수는 문자열의 각각의 문자 사이에 특정문자를 삽입해줍니다. 이러한 문자열은 내부적으로 리스트와 비슷하게 동작하기 때문에 리스트 자료형을 넣어줘도 같은 결과를 얻을 수 있습니다.

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

upper / lower

upper 는 문자열을 모두 대문자로, lower는 모두 소문자로 바꾸어주는 함수입니다.

Python
>>> a = "Computer"
>>> a.upper()
'COMPUTER'
>>> a.lower()
'computer'

strip / lstrip / rstrip

문자열에 포함된 공백문자를 제거해주는 함수입니다. 다른 언어에서 trim() 같은 함수와 같습니다.

Python
>>> a = "      aa       "
>>> a.lstrip()
'aa       '
>>> a.rstrip()
'      aa'
>>> a.strip()
'aa'

replace

특정 문자 혹은 문자열을 다른 문자열로 치환(교체)해주는 함수입니다.

Python
>>> a = 'My Office is so far.'
>>> a.replace('so far', 'very good')
'My Office is very good.'

split

Python
>>> a = 'My Office is so far.'
>>> a.split()
['My', 'Office', 'is', 'so', 'far']
>>> b = '192.168.0.1'
>>> b.split('.')
['192','168','0','1']

split 함수는 문자열을 구분해서 list로 만들어준다. 그리고 구분자로 사용될 문자열을 지정해주지 않으면 기본적으로 공백(space, tab, enter 등)을 기준으로 자동으로 나눈다.

이렇게 문자열에 대해서 알아보았는데, 활용빈도가 높은 함수 위주로 설명했고 이 외에도 수많은 함수가 있습니다. 다음 포스팅에서는 숫자형에 대해서 알아보도록 하겠습니다.

More on this topic

Comments

LEAVE A REPLY

Please enter your comment!
Please enter your name here