✏️

220816 | ② Python / 문자열 특징 - 아스키코드, 유니코드, 인덱싱, 슬라이싱, 문자열 메소드 본문

K-Digital Training

220816 | ② Python / 문자열 특징 - 아스키코드, 유니코드, 인덱싱, 슬라이싱, 문자열 메소드

콩세 2022. 10. 6. 14:22

https://bean-three.tistory.com/16

 

220811 | ② 반복문(for) / 기타 제어문 / 문자열

3. 반복문 일정 횟수만큼, 또는 조건식을 만족하는 동안 블록을 반복 실행하는 문장. 220810 | ② 멤버십 연산자, 동일성 연산자 / 제어문: 조건문(if, else, elif), match-case, 반복문(while) ▷자료형 변환

bean-three.tistory.com

220811 ②번 글에 이어서 문자열에 대해 더 작성하겠음!


문자열 특징

- 불변데이터 (immutable) : int, float, bool 등은 한 번 만들어지면 컴퓨터 메모리에 저장되어 변하지 않는다.

- + 연산자로 문자열 접합

- * 연산자로 문자열 반복

- 아스키 코드 (ASCII) 변환 가능

- 유니코드 지원

 


 

아스키코드(ASCII) 

- 컴퓨터는 숫자를 저장할 때 바로 저장하지 않고, 2진수로 변환해서 저장한다.

- 과거 미국에서 사용되던 표준 문자 변환 규칙.

 

- ord(): 입력받을 알파벳 또는 특수문자에 대한 아스키 코드 숫자 계산 (문자->숫자)

print('a =>', ord('a'))
print('b =>', ord('b'))
print('c =>', ord('c'))
a => 97
b => 98
c => 99

 

- chr(): 입력받은 아스키 코드 숫자에 대한 알파벳 또는 특수문자 계산 (숫자->문자)

print('97 =>', chr(97))
print('98 =>', chr(98))
print('99 =>', chr(99))
97 => a
98 => b
99 => c

유니코드(Unicode)

아스키 코드를 확장하여 더 많은 문자에 대한 변환 규칙을 추가한 방식.

- 16진수 4자리수로 만들어진다.

print('유니코드 61 =>', '\u0061')
print('유니코드 62 =>', '\u0062')
print('유니코드 63 =>', '\u0063')
print('유니코드 ? =>', '\uabcd')
유니코드 61 => a
유니코드 62 => b
유니코드 63 => c
유니코드 ? => ꯍ

 


 

 

인덱싱 / 슬라이싱

- 텍스트 시퀀스(=문자열)

- 인덱스 : 순번, 특정 문자가 몇 번째 있는지 그 번호를 의미.

- 인덱싱 (indexing) : 인덱스를 사용하여 부문 문자를 추출하는 문법.

- 슬라이싱 (slicing) : 인덱스를 사용하여 부문 문자열을 추출하는 문법.

(인덱싱은 문자 하나만 추출, 슬라이싱은 여러개 추출)

 

- 인덱싱

s = "Hello, Student. I'm teacher."
print(s[0])  # 인덱싱을 이용해서 0번(첫 번째 문자) 인덱스의 문자 추출
print(s[1])  # 인덱싱을 이용해서 1번(두 번째 문자) 인덱스의 문자 추출
H
e

(공백, 쉼표 등도 문자에 포함됨)

(존재하지 않는 문자열의 범위 지정 시, 오류 발생.)

 

- 슬라이싱

print(s[0:5])  # 0 ~ 4번 인덱스의 문자열 추출
print(s[7:15]  # 7 ~ 14번 인덱스의 문자열 추출
print(s[-8:-2])  # -8 ~ -1번 인덱스의 문자열 추출
Hello
Student.
teacher

(범위를 벗어난 인덱스도 처리 가능.)

print(s[5:23:2])  # 5 ~ 22번 인덱스의 문자열을 2개씩 건너뛰어가며 추출
print(s[::3])  # 처음부터 끝까지 문자열을 3개씩 건너뛰어가며 추출
,Suet ' e
Hl un meh.

(,) 부터 a 까지가 5 ~ 22번 인덱스 이고,

2개씩 건너뛰어서 추출하면

(,) (S) (u) (e) (t) ( ) (') ( ) (e) => ,Suet ' e

 


 

문자열 메소드

 

- 철자 관련

s1 = "Hello,, World! Hi Students"
print(s1.lower())  # lower(): 모든 알파벳을 소문자로 변환
print(s1.upper())  # upper(): 모든 알파벳을 대문자로 변환
print(s1.title())  # title(): 각 단어의 첫 글자를 대문자로, 나머지는 소문자로 변환
print(s1.capitalize())  # capitalize(): 맨 첫 글자를 대문자로, 나머지는 소문자로 변환
hello, world! hi students
HELLO, WORLD! HI STUDENTS
Hello, World! Hi Students
Hello, world! hi students

- 탐색 관련

 

find() : 문자열을 찾을 때 사용하는 함수. 찾은 문자열의 위치를 인덱스로 계산

s2 = "apple banana orange apple orange ornage"
print(s2.find('apple'))
print(s2.find('banana'))
print(s2.find('orange'))
0
6
13

 

rfind() : 오른쪽부터 문자열을 찾을 때 사용하는 함수.

print(s2.rfind('apple'))
print(s2.rfind('banana'))
print(s2.rfind('orange'))
20
6
33

 

print(s2.find('orange', 14))  # 어디에서부터 찾을 지 시작 인덱스 설정 가능
print(s2[14:].find('orange')+14)
# 14번 이후부터 orange를 찾아라. 그리고 14번부터 찾기 시작해서 앞에 문자들은 사라졌으니까 마지막에 +14를 해주자.

print(s2.find('orange', 14, 26))  # 어디에서부터 어디까지 찾을지 시작 및 끝 인덱스 설정 가능
print(s2.find('melon'))  # 못찾으면 오류가 아닌 -1이 출력된다.
26
26

-1
-1

 

index() : 문자을을 찾을 때 사용하는 함수, 찾은 문자열의 위치를 인덱스로 계산.

print(s2.index('apple'))
print(s2.index('melon'))  # melon은 문자열에 없기 때문에 오류가 발생한다.
0
오류발생

 

count() : 문자열이 몇 개 있는지 찾을 때 사용하는 함수

print(s2.count('apple'))
print(s2.count('banana'))

print(s2.count('melon'))  # melon은 문자열에 없어서 셀 수 없으니 0으로 출력됨
2
1
0

- 정렬 관련

s = 'python'
print('#', s.center(10), '#', sep='')  # center(폭): 주어진 폭에서 문자열을 가운데 정렬
print('#', s.ljust(10), '#', sep='')  # ljust(폭): 주어진 폭에서 문자열을 왼쪽 정렬
print('#', s.rjust(10), '#', sep='')  # rjust(폭): 주어진 폭에서 문자열을 오른쪽 정렬
#  python  #
#python    #
#    python#

sep='' => python 문자랑 공백 띄어쓰기 없이 추출하기 위해서 뒤에 써줌.


- 검사 관련

 

islower() : 문자열이 모두 소문자로 이루어져 있는지 검사

is upper() : 문자열이 모두 대문자로 이루어져 있는지 검사

s1 = 'abcd'
s2 = 'ABCD'
print(s1.islower())  # islower(): 문자열이 모두 소문자로 이루어져 있는지 검사
print(s1.isupper())  # isupper(): 문자열이 모두 대문자로 이루어져 있는지 검사
print(s2.islower())
print(s2.isupper())
True
False
False
True

 

isalpha() : 문자열이 모두 알파벳으로 이루어져 있는지 검사

s3 = '1234'
print(s1.isalpha())
print(s2.isalpha())
print(s3.isalpha())
True
True
False

 

isnumeric() : 문자열이 모두 숫자로 이루어져 있는지 검사

print(s1.isnumeric())
print(s2.isnumeric())
print(s3.isnumeric())
False
False
True

 

isspace() : 문자열이 모두 숫자로 이루어져 있는지 검사

s4 = "     "
print(s1.isspace())
print(s2.isspace())
print(s3.isspace())
print(s4.isspace())
False
False
False
True

 

startswith() : 원본 문자열이 제시된 문자열로 시작하는지 검사

endwith() : 원본 문자열이 제시된 문자열로 끝나는지 검사

print(s1.startswith('a'))

print(s1.endswith('a'))

 

True
False

- 변경

 

replace('기존 str', '새 str') : 기존 문자열에서 새 문자열로 교체

s1 = 'Hello World!'
print(s1. replace('Hello', 'Hi'))

s2 = s1.replace('Hello', 'Hi').replace('Wolrd', 'Students')
print(s2)

s3 = s1.replace('Hello', 'Hi').replace('Wolrd', 'Students').replace('!', '?')
Hi World!
Hi Students!
Hi Students?

 

lstrip() : 왼쪽 공백을 제거

rstrip() : 오른쪽 공백을 제거

strip() : 모든 공백을 제거

s4 = '     Hello     Wolrd     '
print('#', s4.lstrip(), '#', sep='')
print('#', s4.rstrip(), '#', sep='')
print('#', s4.strip(), '#', sep='')
#Hello    World    #
#    Hello    World#
#Hello    World#

 

+) replace()로 모든 공백 제거하기

print('#', s4.replace(' ', ''), '#', sep='')
#HelloWorld#

- 분할

 

split('기준') : 문자열을 제시된 기준으로 잘라서 목록으로 만듦.

s5 = 'Hello, World! Hi, Students!'

print(s5.split())  # 공백을 기준으로 문자열을 자르고 목록에 담아서 추출.

for substr in s5.split():  # 목록을 기준으로 반복문 작성.
    print(substr)

 

['Hello,', 'World!', 'Hi,', 'Students!']

Hello,
World!
Hi,
Students!

 

print(s5.split('!'))  # 느낌표를 기준으로 문자열 자르기
['Hello, World', ' Hi, Students', '']

총 3개의 덩어리로 잘라지는 것을 확인할 수 있음!

두번째 덩어리 문자 앞에 공백 있는거, 마지막 문자열은 없의까 ''로만 끝나는거 확인.


- 접합

 

'붙일 사이 문자열', join([붙일 대상 목록]) : 문자열을 접합시킴.

substr_list = s5.split()  # 잘라낸 목록을 subtr_list라는 변수에 저장.

print('/'.join(substr_list))

print('\n'.join(substr_list))
Hello,/World!/Hi,/Students!

Hello,
World!
Hi,
Students!