문자열¶
문자열은 리터럴 문자열에서 살펴본 바와 같이 작은 따옴표, 큰 따옴표로 둘러싸면 문자열이 됩니다. 또는 str(x)
함수를 이용해서 문자열을 만들 수 있습니다. str(x)
는 x
객체의 __str()__
함수가 구현되어 있으면 x.__str()__
값이 반환되고 그렇지 않으면 repr(x)
값이 반환됩니다.
In [1]: 문자열 = str(123.12)
...: type(문자열)
...:
Out[1]: str
문자열 접근¶
문자열은 수집형 의 일종이기 때문에 문자열에 있는 하나 하나의 문자들을 인덱스를 통해 접근할 수 있습니다. 파이썬에서 인덱스란 열거형 안에 있는 항목들의 순서를 나타내는 0부터 시작하는 양의 정수를 말합니다.
문자열 = "문자열은 열거형이라서 인덱스를 통해서 성분들을 접근할 수 있습니다."
print("인덱스 0인 문자:", 문자열[0])
인덱스 0인 문자: 문
열거형은 슬라이싱도 가능합니다. 즉, 원하는 부분만 추려낼 수 있습니다.
문자열 = "문자열은 열거형이라서 인덱스를 통해서 성분들을 접근할 수 있습니다."
print("0부터 10까지 성분들:", 문자열[0:11])
0부터 10까지 성분들: 문자열은 열거형이라서
열거형의 성분들의 갯수를 알 수 있는 len()
함수를 이용할 수 있습니다.
문자열 = "문자열 성분의 갯수를 알수 있습니다."
len(문자열)
18
문자열의 마지막 문자를 알아보기 위해서 다음과 같이 문자열의 크기로 접근하면 에러가 납니다.
문자열 = "문자열 성분의 갯수를 알수 있습니다!"
문자열크기 = len(문자열)
문자열[문자열크기]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-71-db68cc434fbd> in <module>()
1 문자열 = "문자열 성분의 갯수를 알수 있습니다!"
2 문자열크기 = len(문자열)
----> 3 문자열[문자열크기]
IndexError: string index out of range
왜냐하면 문자열의 인덱스는 0부터 시작하기 때문에 문자열의 마지막
인덱스는 len(문자열)-1
이 됩니다.
문자열 = "문자열 성분의 갯수를 알수 있습니다!"
문자열크기 = len(문자열)
문자열[문자열크기 - 1]
'!'
+
연산자를 이용해서 2개의 문자열을 붙일 수 있습니다.
"앞 문자열" + "뒷 문자열"
'앞 문자열뒷 문자열'
그런데 숫자와 문자열을 붙일려고 +
연산자를 사용하면 다음과 같은
에러가 납니다.
"문자열" + 100
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-74-a8d3652033c4> in <module>()
----> 1 "문자열" + 100
TypeError: must be str, not int
100
은 숫자형이라서 문자열과 +
덧셈이 정의되지 않아서 에러를
내는 것입니다. 이럴때는 숫자형을 문자형으로 변형하는 str()
메소드를
사용하면됩니다.
"문자열" + str(100)
'문자열100'
비교 연산¶
비교 연산자 <, >, ==
를 이용하여 두 문자열을 비교할 수 있습니다. 두
문자열은 사전식 배열의 순서를 가지고 앞, 뒤를 비교합니다. 문자열은 사전식
배열에서 뒤에 있을 수록 커진다.
"나는" < "너는"
True
단어 = "한글"
if 단어 == "한글":
print(단어+"을 사랑합시다.")
한글을 사랑합시다.
모든 영문 대문자는 소문자보다 앞에 있습니다.
'Z' < 'a'
True
in
과 not in
연산¶
문자열 안에 부분 문자열이 있는지를 확인할 수 있는 연산자 in
또는
not in
을 사용할 수 있습니다.
"사" in "사과"
True
"소" in "사과"
False
"붕어" in "붕어빵에 붕어가 있습니다?"
True
"호두알" not in "호두과자"
True
for문 이용 문자열 순회¶
성 = "윤김이정강박"
이름 = "예은"
for 문자 in 성:
print(문자+이름)
윤예은
김예은
이예은
정예은
강예은
박예은
불변(immutable)¶
문자열은 불변이라서 한 번 만들어진 문자열 객체의 내용을 변경할 수 없습니다. 아래와 같이 문자열의 일부를 변경하려고 하면 에러를 발생시킨다.
문자열 = "문자열의 내용은 변경할 수 없습니다."
문자열[0] = '글'
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-84-b66cd0a0738b> in <module>()
1 문자열 = "문자열의 내용은 변경할 수 없습니다."
2
----> 3 문자열[0] = '글'
TypeError: 'str' object does not support item assignment
그렇지만 새로운 객체를 기존의 변수에 대입하는 것은 아무 문제가 되질 않습니다.
문자열 = "문자열의 내용은 변경할 수 없습니다."
문자열 = "새로운 문자열 객체를 대입합니다."
print(문자열)
새로운 문자열 객체를 대입합니다.
format¶
형식 문자열(format string)에 대해서
format()
메소드를 사용할 수 있습니다. 형식 문자열이란 중괄호 { }
를
포함하는 문자열을 말합니다. 형식 문자열은 중괄호 기호를 제외한 모든
문자열을 리터럴 문자열로 간주합니다. 형식 문자열 안에 중괄호를 표시하려면
중괄호를 두 번 {{
또는 }}
를 사용하면 됩니다.
문 = "format 메소드에서는 중괄호 {}를 제외한 모든 문자열은 리터럴 문자열로 간주합니다!. 중괄호를 표시하고 싶으면 {{ 와 같이 두 번 }} 쓴다."
문.format("(이곳이 중괄호가 있던 곳입니다)")
'format 메소드에서는 중괄호 (이곳이 중괄호가 있던 곳입니다)를 제외한 모든 문자열은 리터럴 문자열로 간주합니다!. 중괄호를 표시하고 싶으면 { 와 같이 두 번 } 쓴다.'
변수 문
에 대입되는 문자열 안에 중괄호가 포함되어 있기 때문에 형식 문자열이 됩니다. 형식 문자열 안의 중괄호에는 format(인자)
메소드에 인자를 넣어서 중괄호를 대체할 수 있습니다. 여기서는 "(이곳이 중괄호가 있던 곳입니다)"
문자열 인자를 넣었습니다. 중괄호 안에 공백 문자가 있으면 format()
메소드 사용시 다음과 같은 에러가 나므로 중괄호 안에는 형식에 맞도록 사용해야 합니다.
"중괄호 { } 안에 공백 문자가 있으면 에러가 납니다".format("에러") # 중괄호 사이에 공백문자(스페이스)가 있어 에러
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-87-6cc1067c8bc1> in <module>()
----> 1 "중괄호 { } 안에 공백 문자가 있으면 에러가 납니다".format("에러") # 중괄호 사이에 공백문자(스페이스)가 있어 에러
KeyError: ' '
예제¶
예제를 통해서 익혀보자. 중괄호 안에 인자의 순서에 해당하는 인덱스를 넣어서 원하는 위치에 인자값을 표시할 수 있습니다.
"{0}번째, {1}번째, {2}번째".format("첫", "두", 3)
'첫번째, 두번째, 3번째'
인자의 인덱스를 바꾸어 출력되는 값을 변경할 수 있습니다.
"순서를 바꿀 수 있습니다. {1}번째, {2}번째, {0}번째".format("첫", "두", 3)
'순서를 바꿀 수 있습니다. 두번째, 3번째, 첫번째'
중괄호 안을 비워두면 인자가 순서대로 대입됩니다. 중괄호 안에 인덱스가 부분적으로 들어가면 에러가 납니다. 인자의 인덱스는 모두 들어가든지 아니면 모두 비워 두어야 합니다. 단 키워드 인자의 이름은 어느 곳에 위치해도 상관없습니다.
"{}번째, {}번째, {}번째".format("첫", "두", 3)
'첫번째, 두번째, 3번째'
함수 단원에서 배웠던 *
연산자를 통해서 리스트 또는 튜플을 인자에서
풀어서 사용할 수 있습니다.
풀리는인자 = ("첫", "두", "3")
"{}번째, {}번째, {}번째".format(*풀리는인자)
'첫번째, 두번째, 3번째'
인자의 인덱스를 중복해서 사용할 수 있고 사용하지 않아되 됩니다.
"{0}번째, {2}번째, {0}번째".format("첫", "두", 3)
'첫번째, 3번째, 첫번째'
format()
메소드 인자로 키워드 인자가 들어갈 수 있습니다. 키워드 인자의
이름 중괄호 안에 대입하여 원하는 결과를 만들어 냅니다.
"우리가 사용하는 {언어}은 {만든이}과 여러 학자들이 만들었습니다.".format(언어="한글", 만든이="세종대왕")
'우리가 사용하는 한글은 세종대왕과 여러 학자들이 만들었습니다.'
객체의 속성을 표시할 수 있습니다. 복소수는 실수부분과 허수부분의 속성을 갖고 있습니다. 이 속성을 키워드와 인덱스를 이용하여 접근하여 표시할 수 있습니다.
복소수 = 2 - 5j
print("복소수의 실수부분은 {수.real}이고 허수부분은 {수.imag}입니다.".format(수=복소수)) # 키워드 이용
print("복소수의 실수부분은 {0.real}이고 허수부분은 {0.imag}입니다.".format(복소수)) # 인덱스 이용
복소수의 실수부분은 2.0이고 허수부분은 -5.0입니다.
복소수의 실수부분은 2.0이고 허수부분은 -5.0입니다.
중괄호 안에 콜론 :
뒤에 삽입될 문자열에 대한 세부 형식을 지정할 수
있습니다. 즉 {인자이름:형식}
과 같이 사용할 수있습니다. 형식
은 다음과
같습니다.
[[채울문자]정렬기호][부호][#][0][길이][그룹옵션][.소숫점길이][타입]
길이
란 출력될 문자열의 크기입니다. 채울문자
는 문자열이
삽입되고 지정된 길이의 남는 공간을 채울 문자입니다. 정렬기호
란
삽입될 문자열이 배치될 위치를 나타내는 문자입니다.
정렬기호 |
의미 |
---|---|
|
삽입될 문자열을 왼쪽에 위치 |
|
삽입될 문자열을 오른쪽에 위치 |
|
삽입될 문자열을 가운데 위치 |
문 = "삽입 문자열"
print("{:#^20}".format(문))
#######삽입 문자열#######
채울문자
를 지정했으면 반드시 정렬기호
가 함께 입력되어야 합니다.
문 = "삽입 문자열"
print("{:*20}".format(문))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-96-1227b77267ec> in <module>()
1 문 = "삽입 문자열"
2
----> 3 print("{:*20}".format(문))
ValueError: Invalid format specifier
채울 문자 *
이 있는데 뒤에 정렬 기호가 없기 때문에 오류가 발생합니다.
부호
는 삽입될 인자가 숫자일 때 사용하는 것으로 +
, -
,
스페이스(공백)가 입력가능합니다.
부호 옵션 |
의미 |
---|---|
|
양수, 음수 모두 부호 표시 |
|
음수일 때만 부호 표시 |
|
양수일 때는 부호가 스페이스(공백)이고 음수일 때는 |
print("{:#^+10}".format(1.234))
print("{:#^ 10}".format(1.234))
##+1.234##
## 1.234##
#
문자는 삽입 인자가 숫자형일 때 사용되는 것으로 타입
에 따라서
이진법은 0b
, 8진법은 0o
, 16진법은 0x
가 숫자 앞에 표시됩니다.
print("정수: {0:#d}, 2진수: {0:#b}, 8진수: {0:#o}, 16진수: {0:#x}".format(23))
정수: 23, 2진수: 0b10111, 8진수: 0o27, 16진수: 0x17
더 자세한 형식 문자열은 https://docs.python.org/3/library/string.html#formatstrings 을 참조하자.
replace¶
replace(찾을, 바뀔)
찾을
문자열을 바뀔
문자열로 모두 바꾸어
새로운 문자열을 반환합니다.
문자열 = "아찔아찔 현기증이 납니다."
새문자열 = 문자열.replace("아", "어")
print("새문자열:", 새문자열)
새문자열: 어찔어찔 현기증이 납니다.
startswith, endswith¶
startswith(시작문자열)
시작문자열
로 시작하면 True
를
반환하고 그렇지 않으면 False
를 반환합니다. 마찬가지로
endswith(끝나는문자열)
끝나는문자열
로 끝나면 True
그렇지
않으면 False
를 반환합니다.
문자열 = "반짝 반짝 작은 별"
print(문자열.startswith("반짝"))
print(문자열.endswith("별"))
print(문자열.startswith("번쩍"))
print(문자열.endswith("벌"))
print(문자열.startswith(("번쩍", "반짝"))) # 문자열 튜플이 올 수 있습니다.
True
True
False
False
True
count¶
count(찾을문자열)
찾을문자열
의 갯수를 반환합니다.
문자열 = "반짝 반짝 작은 별"
문자열.count("반짝")
2
find¶
문자열.find(찾을문자열)
문자열 안에 찾을문자열
이 처음으로
발견되는 인덱스를 반환합니다. 찾는 문자열이 없으면 -1
을 반환합니다.
문자열 = "반짝 반짝 작은 별"
문자열.find("짝")
1
참고: 문자열 안에 찾을 문자열이 있는 지 없는 지를 알고 싶으면 in
을
사용합니다.
문자열 = "반짝 반짝 작은 별"
"짝" in 문자열
True
split¶
문자열 메소드 중에서 많이 사용되는 메소드 중의 하나가 split
입니다.
여러 단어로 이루어진 문자열을 여백을 기준으로 단어들을 분리해서 리스트를
만들어 반환합니다. 리스트를 만들어 반환할 때 여백은 포함시키지 않습니다.
여백(whitespace)이란 탭(tab), 새 줄(new line), 공백(space) 문자들을
의미합니다.
문자열 = "너의 마음은 나의 마음\n 나의 마음은 너의 마음"
문자열.split()
['너의', '마음은', '나의', '마음', '나의', '마음은', '너의', '마음']
문자열.split(구분문자열)
을 이용하면 구분문자열
을 기준으로
문자열을 분리합니다.
문자열 = "너의 마음은 나의 마음 나의 마음은 너의 마음"
문자열.split("의")
['너', ' 마음은 나', ' 마음 나', ' 마음은 너', ' 마음']
구분 문자열이 연속이 될 때는 빈 문자로 분리됩니다.
"1,,2,3".split(',')
['1', '', '2', '3']
낱 글자로 분리하려면 list()
를 이용합니다.
문자열 = "너의 마음은 나의 마음"
list(문자열)
['너', '의', ' ', '마', '음', '은', ' ', '나', '의', ' ', '마', '음']
직접하기
input()
함수를 이용해서 여러 개의 숫자를 한꺼번에 입력받아 모두 더한 값을 출력하는 프로그램을 작성하시오.
join¶
문자열.join(반복가능객체)
은 반복가능객체
의 각 성분 사이를
문자열
로 연결합니다.
전화번호 = "010 1234 5678"
번호리스트 = 전화번호.split()
print("번호리스트:", 번호리스트)
번호 = "-".join(번호리스트)
print("연결된 번호:", 번호)
번호리스트: ['010', '1234', '5678']
연결된 번호: 010-1234-5678
반복가능 객체의 요소는 문자열이어야 합니다. 다음 리스트는 반복가능한 객체이지만 요소들이 튜플이므로 에러를 발생합니다.
반복가능 = [("ㄱ", "ㄴ"), ("ㄷ", "ㄹ")]
"-".join(반복가능)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-109-d0a56bbe4d5e> in <module>()
1 반복가능 = [("ㄱ", "ㄴ"), ("ㄷ", "ㄹ")]
----> 2 "-".join(반복가능)
TypeError: sequence item 0: expected str instance, tuple found
더 많은 메소드들¶
help()
함수 및 dir()
함수를 이용하면 파이썬 객체들의 도움말을 볼 수 있습니다.
In [2]: help(str)
Help on class str in module builtins:
class str(object)
| str(object='') -> str
| str(bytes_or_buffer[, encoding[, errors]]) -> str
|
| Create a new string object from the given object. If encoding or
| errors is specified, then the object must expose a data buffer
| that will be decoded using the given encoding and error handler.
| Otherwise, returns the result of object.__str__() (if defined)
| or repr(object).
| encoding defaults to sys.getdefaultencoding().
| errors defaults to 'strict'.
|
| Methods defined here:
|
| __add__(self, value, /)
| Return self+value.
str
의 lower
메소드에 대해서 알아볼 수 있습니다.
In [3]: help(str.lower)
Help on method_descriptor:
lower(self, /)
Return a copy of the string converted to lowercase.
dir()
함수를 이용하면 객체의 속성들을 볼 수 있습니다. 다음은 str
객체의 속성들을 일부분 보여준 것입니다.
In [4]: dir(str)
Out[4]:
['__add__',
'__class__',
'__contains__',
'__delattr__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__getitem__',
'__getnewargs__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
직접하기
문자열
'010*1234****5678'
을'010-1234-5678'
로 바꾸는 프로그램을 작성하시오.
문자열에 대해서 더 세밀한 작업을 하려면 정규 표현식(regular expression) 모듈 re을 살펴보면 됩니다.
연습문제¶
사용자로부터
input()
함수를 이용하여 숫자 5개를 쉼표로 구분해서 입력을 받아split()
을 이용하여 리스트로 만들어 각각의 수를 출력하시오.사용자로부터 문자열을 입력받아 그 문자열 안에 “는”이라는 문자가 포함된 단어와 단어의 갯수를 출력하는 프로그램을 작성하시오.
문자열
"너의 마음은 나의 마음 나의 마음은 너의 마음"
에서"너"
는"나"
로"나"
는"너"
로 바꾸는 프로그램을 작성하시오.사용자로부터 휴대폰 전화번호를 입력받고 유효한 번호인지를 확인하는 함수
전화번호확인(문자열)
를 작성하시오. 유효하면 입력한 번호를 xxx-xxxx-xxxx 형식으로 출력하시오. 입력 받는 문자 중에-
는 유효한 것으로 받아들이도록 합니다. 아래 그림과 같은 결과가 나오도록 하시오.새로운 암호를 만들 때 숫자, 문자, 특수문자가 반드시 한 문자 이상씩 포함되어야 하고 문자의 갯수는 적어도 8자 이상이어야 합니다. 사용자가 문자열을 입력했을 때 암호 조건에 맞는지 확인하는 프로그램을 작성하시오. 공백문자는 포함하면 안됩니다. 특수문자는 다음을 사용합니다.
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
포멧(format) 함수¶
문자열을 생성하려고 할 때, 종종 다른 정보들을 포함하여 생성하고 싶을 때가 있습니다. 이럴 때 format() 함수를 이용해서 문자열을 편리하게 다룰 수 있습니다.
age = 20
name = '홍길동'
print('{0}의 나이는 {1}살 입니다.'.format(name, age))
print('{0}은 파이썬 프로그래밍을 좋아합니다.'.format(name))
괄호 { }
안의 숫자는 format()
에 있는 인수의 인덱스를 나타냅니다. 인덱스는 0부터 시작합니다. { }
안의 숫자가 없으면 인자의 순서대로 들어가게 됩니다. 중괄호 {}
를 포함하는 문자열을 형식 문자열(formatted string)이라고 합니다. 형식 문자열은 데이터 형 부분에서 자세히 다룬다.
age = 20
name = '홍길동'
print('{}의 나이는 {}살 입니다.'.format(name, age))
print('{}은 파이썬 프로그래밍을 좋아합니다.'.format(name))
괄호 {}
안에 공백이 있으면 안됩니다. 표시되는 형식을 더 세밀하게
조정할 수 있습니다.
# 소수점 3자리까지 표시
print('{0:.3f}'.format(1.0/3))
# 밑줄 문자 '_' 로 11칸을 채우고, 그 중간에 'hello' 문자열을 놓습니다.
# (^) 은 문자열을 중앙에 위치시키고 (>)은 오른쪽, (<)은 왼쪽에 위치시킨다.
print('{0:_^11}'.format('hello'))
# 변수를 이용해서 표시할 수 있습니다.
print('{name}는 {book} 책을 만들고 있습니다.'.format(name='윤대기', book='"파이썬 한 입"'))
0.333
___hello___
윤대기는 "파이썬 한 입" 책을 만들고 있습니다.
형식문자열 리터럴¶
형식문자열 리터럴은 문자열 앞에 f
또는 F
를 붙이고 표현식 expression 로 작성하여 문자열에 파이썬 표현식의 값을 삽입할 수 있게 만든 문자열입니다. 선택적인 포맷 지정자가 표현식 뒤에 올 수 있습니다. 이것으로 값이 포맷되는 방식을 더 정교하게 제어할 수 있습니다. 다음 예는 원주율을 소수점 이하 세 자리로 반올림합니다.
탈출 문자열(escape sequence)¶
'What's your name?'
과 같이 작은 따옴표 '
로 만들어진 문자열
안에 작은 따옴표가 있으면 문자열이 어디서 끝나는지를 명확하게 알 수 없게
되므로 에러를 냅니다.
'What's your name'
File "<ipython-input-14-d10fcea8627e>", line 1
'What's your name'
^
SyntaxError: invalid syntax
이 때는 "What's your name?"
과 같이 큰 따옴표를 사용해도 되지만
탈출 문자 역슬래시 \
를 이용해서 작은 따옴표를 사용하면서도 문자열
안에 작은 따옴표 '
를 넣을 수 있습니다. 즉, \'
와 같이 작은 따옴표
앞에 역슬래시 \
를 붙임으로 작은 따옴표를 문자열을 만드는 문자가
아니라고 인식하게 합니다. 마찬가지 방법으로 탈출문자와 큰 따옴표를
사용함으로 큰 따옴표를 문자열에 포함시킬 수 있습니다.
'What\'s your name'
"What's your name"
역슬래시 자체를 문자열에 포함시키려면 역슬래시를 두 번 \\
사용하면됩니다. \n
문자열(new line)을 이용하면 이 문자열이 위치한
곳에서 엔터를 치는 효과를 얻을 수 있습니다. 즉 \n
뒷부분부터 새로운 줄에
표시되게 합니다.
print("첫번째 줄입니다.\n여기부터는 두번째 줄입니다.")
첫번째 줄입니다.
여기부터는 두번째 줄입니다.
\t
문자열을 이용하면 키보드에서 탭(Tab) 키를 누른 효과를 낼 수 있습니다.
print("하나\t둘\t셋")
하나 둘 셋
문자열에 대한 자세한 사용법은 앞으로 나올 클래스 부분에서 다루게 될 것입니다.