CS & DS/Basic Python with Data Crawling
Python Data type (string) 파이썬 자료형 (문자열)
EthanJ
2022. 10. 6. 19:01
Python Data type 파이썬 자료형
3) string (문자열)
> string 생성
- 여닫는 따옴표는 반드시 문자의 앞 뒤에서 같은 종류의 한 쌍으로 완성해야한다.
1. 한 줄 문자열 : ' , "
"123"
# 숫자 백이십삼이 아니라 문자 일이삼으로 읽는 것
'123'
"안녕
반가워"
# 여닫는 따옴표가 다른 줄에 있으면 오류 발생
# 여는 따옴표와 닫는 따옴표는 같은 줄에 있어야한다. 여러 줄에 걸쳐있으면 안된다.
SyntaxError: EOL while scanning string literal
a = "안녕\n반가워"
print(a)
# 명령어 출력되는 창 == 콘솔
# 역슬래쉬 + n == 개행문자 == 줄바꿈(enter)
안녕
반가워
a = "안녕\\\n반가워"
print(a)
안녕\
반가워
2. 여러 줄 문자열 : '''(' * 3), """(" * 3)
- print() > enter(줄바꿈) 그대로 반영되는 문자열로 처리
- 단, 변수명만 실행 시 (print() 없이 주피터노트북 결과) > 줄바꿈 표시 X, \n으로 처리
a ="""안녕
반가워"""
print(a)
안녕
반가워
a
# 여러 줄을 한 줄로 바꿈 > 줄바꿈 → '\n'으로 출력
# print() : 화면에 출력 vs. 변수명(원본 자체 내용 미리보기) 실행 차이
'안녕\n반가워'
3. 문자 속에 문자열 기호 사용하기
- 문자열에서 자주 쓰는 기호 : ', "
- 언어, 문자에서 많이 쓰이는 기호 e.g. she's, "설렁탕을 사왔는데 왜 먹지를 못하니..."
# 1) 다른 종류로 쓰기 - 홑따옴표 표시할 시 > 쌍따옴표로 문자열 감싼다
a = "she's happy."
print(a)
she's happy.
# practice
title = '오늘은 "미세먼지" 좋음'
print(title)
# tip) [ctrl] + [a] == 전체 선택
# 커서 이동 단위 선택 == [ctrl] + [방향키]
오늘은 "미세먼지" 좋음
# 2) 같은 종류 따옴표 내부에서 문자 따옴표를 쓸 때는
# 따옴표 왼쪽에 backslash(\) > 해당 따옴표가 여닫는 용도로 쓰이지 않았음을 명시
b ="\"He's sad.\""
print(b)
"He's sad."
# 만약 문자열이 너무 길어서 보는데 불편한 경우
# \만 써주고 엔터로 줄을 넘김 > print() 표시상으로는 두 줄 > 실제 메모리상으로는 한 줄로 인식되는 string
c = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
aaaaaaaaaaaaaaaaaaaaaaaaa'
print(c)
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
> 연습문제
아래와 같은 여러 줄의 문장을 문자열로 만들어서 lines라는 변수에 할당하세요.
파이썬도 배우고
장고도 배우고
할 게 너무 많아
case1) 여러 줄 문자열 활용하기 (lines 변수에 할당)
case2) 한 줄 문자열 내부에서 \n 사이사이에 활용하기. (line 변수에 할당)
# case1)
lines = """파이썬도 배우고
장고도 배우고
할 게 너무 많아"""
print(lines)
파이썬도 배우고
장고도 배우고
할 게 너무 많아
line ="파이썬도 배우고 \n장고도 배우고 \n할 게 너무 많아"
print(line)
파이썬도 배우고
장고도 배우고
할 게 너무 많아
> 연산하기
1. 산술연산자 : 문자, 숫자를 함께 연산하기 위한 문법기호
- 문자와 문자를 연결
- 동일한 문자를 반복해서 연결
# 문자와 문자를 연결
"가" + "나"
'가나'
# 1. 문자열 자체에 공백 추가하기('가 나'로 출력되게 만들기)
print("가" + " " + "나")
print("가 " + "나")
print("가" + " 나")
print("가 나")
가 나
가 나
가 나
가 나
# 2."파이썬"의 더하기는 양변 자료가 같거나 논리적으로 비슷하다고 인정되어야 함
# 정수 + 실수 == 논리적 같음을 인정받은 경우 (e.g. 1 + 1.5)
# 문자 + 숫자 == Error (e.g. "가" + 1)
print("가" + 1)
TypeError: can only concatenate str (not "int") to str
# 문자열을 여러 번 반복하는 연산자 : *
# 동일한 문자열을 여러 번 반복 연결
'abc' * 3
'abcabcabc'
# 문자 * 문자 == error
2. 비교 연산자 : 문자의 크기를 비교하기 위한 문법 기호
- 문자의 비교
- 대문자 vs. 소문자 : 대문자 < 소문자
- 알파벳 : 알파벳 순서가 뒤에 있을수록 크기가 더 크다
- 문자열 길이 : 문자열의 길이가 길수록 크기가 더 크다
- ASCII Code : (컴퓨터언어로 표현하기 위해) 문자를 숫자마다 배정
- e.g. 'A' == 65, 'B' == 66, ... , 'a' == 97, 'b' == 98, ...
- string 숫자 '0' == 48, 띄어쓰기(공백) == 32, null == 0
- ord(character) : 문자에 배정된 코드값 확인 함수
# 대문자 vs. 소문자 > 비교연산자 (==, !=, <, >)로 확인
'A' < 'a'
True
# 알파벳의 크기 비교
# 문자열을 대상으로 할 때 > 무조건 첫 글자끼리만 비교
# 문자열의 길이 > 실제 크기비교에 영향 X
# 단, 첫 글자가 같으면 > 그 다음 index의 글자로 크기 비교
'b' < 'BUS'
False
# 영문자와 영문자 이외의 다른 문자간 비교 > 무조건 영문자가 작음
# ASCII code VS UNICODE
'B' < '가'
True
# 해당 문자열이 몇 글자인지 확인하는 함수 > len([string])
len('arhawekmwmemfknfknalskmflam')
27
> index
- item(대상이 가지고 있는 최소 단위의 값)의 위치를 나타내는 고유한 번호
- 첫 번째 위치는 0부터 시작
- 마지막 위치는 -1부터 시작
1) 인덱싱(indexing) : 특정 위치의 하나의 아이템에 접근하기
- 인덱싱 문법 : 객체[인덱스 번호]
# banana 라는 문자열에 대해 인덱싱
text = 'banana'
# banana라는 문자열에서 첫 번째 아이템 == 0번째 인덱스번호로 접근
# 인덱싱 문법 : 객체(== 대상)[index]
text[0]
'b'
#마지막 요소인 a에 접근
print(text[5])
print(text[-1])
a
a
2) 슬라이싱(slicing) : 연속된 범위의 여러 아이템에 접근
- 문법 : 대상객체[처음 인덱스 : 마지막 인덱스(: 간격)]
- 처음 인덱스 번호는 포함 (n ~)
- 마지막 인덱스 번호는 불포함 (~ n-1)
- 간격 조정은 선택 > 기본 1씩 증가
#문자열 생성
text = "hellopythonworld"
# index 0 ~ 15
# index 0 : h
# index 4 : o
# index 5 : p
# index 10 (= 16 - 5): n
# index 11 (= 16 - 4): w
# index 15 : d
# index -6 == index 16 - 6 = index 10 : n
# index -5 == index 16 - 5 = index 11 : w
# index -1 == index 16 - 1 == index 15 : d
# 개념상 index -0 == index 0 (== index len(string)): h
# (1) 처음부터 특정위치까지
# > [0 : 특정 index] > (index 0) ~ (특정 index - 1)까지 지정
# > [0 : (양수 index) 11] > 실제로 index 10까지 (특정 index - 1)
print(text[0 : 11]) # index 0 ~ 10 (==11 - 1)
# index -0 == index len(string)
# 음수 index -n == index (len(string) -n)
# > [0 : (음수 index) -5] > 뒤에서 5번째까지 (index len(string)-5)) > 실제로 index -6까지 (특정 index -1)
# 간격 > 기본값(== 1)
print(text[0 : -5]) # index 0 ~ -6 (==len(text)(==16)-5 - 1) (==11 - 1)
print(text[0:len(text) -5])
hellopython
hellopython
hellopython
#첫 인덱스가 0으로 시작 시 > 생략 가능
text[ :-5]
'hellopython'
# (2) 특정 위치부터 마지막 아이템까지
# 처음 인덱스 > 5 (index 5 : p)
# 원하는 마지막 인덱스 > 10 or -6
# 간격 > 기본값(==1)
print(text[5 : 11]) #[start index : last index + 1]
print(text[5 : -5]) #[start index : last index + 1]
python
python
# (3) 전체 범위 : 처음 인덱스와 마지막 인덱스 모두 쓰지 않으면 된다
# 처음 인덱스 기본값 : 0
# 마지막 인덱스 기본값 : 마지막까지 자동 입력
text[:]
'hellopythonworld'
# 간격 옵션 > e.g. 전체 범위 지정 + 간격 2 > 객체[ : :2]
text[ : :2]
'hloyhnol'
#간격 옵션 > e.g. -1 > 뒤에서부터 간격 1씩
text[ : :-1]
'dlrownohtypolleh'
> 연습문제
20221005 미세먼지 양호함
위의 문장을 weather 변수에 저장한 다음, 날짜는 date 변수에 슬라이싱으로 받아오고,
dust 변수에 미세먼지 정도를 슬라이싱으로 받아서 출력하시오.
출력양식:
날짜 : 20221005
날씨 : 미세먼지 양호함
weather = '20221005 미세먼지 양호함'
date = weather[:8]
dust = weather[9:]
print("날짜 : ", date)
print("날씨 : ", dust)
날짜 : 20221005
날씨 : 미세먼지 양호함
> 포맷팅 (formatting)
- 특정 값만 바뀌고 > 일정한 형식을 가지는 문자열을 작성할 수 있는 기법
%포맷팅
- 데이터 타입에 따른 분류 : 정수, 실수, 문자
- 옵션 : 문자열 길이, 표현할 아이템 개수, 공백
- 가변자료가 들어갈 자리(...)에 구멍(%자료형)을 낸다.
- 구멍이 뚫린 문자열 뒤에 %로 연결 > 집어넣을 값을 적는다.
1) 숫자 값 대입
# 정수 값 포맷팅 : 정수(int) == %d
# 정수 = int or digit(10진수)
print('오늘은 %d일 입니다' %5)
오늘은 5일 입니다
# 정수 자리의 의미 : "지금 집어넣은 자료를 정수로 변환해 출력해주세요"라는 의미
# 실수 대입 시 > 강제로 정수로 변환하여 출력 (소수점 아래를 버림, 반올림 아님!)
'오늘은 %d일 입니다.' %5.7
'오늘은 5일 입니다.'
# 실수(float)값 포맷팅
# %f를 이용하여 값에 대한 구멍을 낸다
# %f > 기본적으로 소수점 6자리까지 표현
"%f 표기" %15
'15.000000 표기'
# %f에 소수점 6자리 넘는 실수 적용시 > 소수점 아래 7번째 자리에서 반올림 발생
"%f 표기" %1.123456789
'1.123457 표기'
# 옵션 : 소수점 아래 자리를 몇 자리까지 출력할지 정할 수 있음
# %0.nf : 소수점 아래 n자리까지만 표현하는 실수
"%0.3f" %1.123456789
'1.123'
# 가변인자 2개 이상일 시 > 대입값은 왼쪽부터 하나씩 전달
# 2개 이상을 대입하는 경우 > 괄호 안에 item 지정, comma,로 연결 > %(첫 번째 값, 두 번째 값, ...)
"오늘은 %d월 %d일입니다." %(10, 5)
'오늘은 10월 5일입니다.'
# %d, %f에 숫자가 아닌 자료를 넣으면 에러 발생
print("%d" %"1") # Error
TypeError: %d format: a number is required, not str
2) 문자 대입
- %s로 구멍 뚫기
- 대입값에 대해서 제한 X > 만능 포맷팅
#문자 포맷팅
"%s님 접속을 환영합니다." %'abc1234'
'abc1234님 접속을 환영합니다.'
#문자 포맷팅 : 문자 이외의 타입
"%s, 숫자도 입력 가능" %100
'100, 숫자도 입력 가능'
"%ss 접속을 환영합니다." %'abc1234'
'abc1234s 접속을 환영합니다.'
> string 내장함수 == 문자열 method
- 내장함수 : 특정 데이터 타입이 자체적으로 가지고 있는 속성으로 존재하는 함수
- 문법 : variable.method() (item.join(str) 제외)
- str.count(item) : 특정 문자열(item)의 개수
- str.find(item(, starting index) : 특정 문자열(item)의 인덱스 번호(위치)
- item.join(str) : 특정 문자열(item)을 문자열(str) 아이템 사이에 입력
- str.upper() : 문자열을 대문자로 변경
- str.lower() : 문자열을 소문자로 변경
- str.capitalize() : 문자열의 첫 글자를 대문자로
- str.swapcase() : 대문자는 소문자로, 소문자는 대문자로 전환
- str.lstrip( )/ str.rstrip( )/ str.strip( ) : 문자열 좌/ 우/ 앞뒤 공백(기본) 및 특정 문자 지우기
> 크롤링 시 많이 사용
#문자열 생성
text = 'tomato juice'
# .count('ch') : string의 특정 character 개수
# text문자열에서의 a의 개수
text.count('a')
1
# .count("str") > 2글자 이상에 대해서도 집계 가능
text.count("to")
2
# .find('ch') : 특정 문자의 인덱스 번호를 반환
# text 문자열에서의 a의 인덱스 반환
text.find('a')
3
# .find() > 같은 것이 있을 때, 가장 앞번호부터 적용, 한 개라도 찾을 시 반환
# .find("str", starting index) > index 0이 아닌 이후 index를 starting point로 지정 가능
text.find('to', 1)
4
# item.join(string) > string "item"을 원본 string "string"의 인덱스 사이사이에 입력
text = 'abc'
",".join(text)
'a,b,c'
# string.upper() > string의 소문자를 대문자로 변환
# 변경된 결과를 함수 내에서 연산해서 보여줌(원본 변화 X) > call by value (값복사)
print(text.upper())
print(text)
TOMATO JUICE
tomato juice
# string.lower() > string의 대문자를 소문자로 변환
# string.upper()와 같이 call by value
text2 = text.upper()
print(text2)
print(text2.lower())
TOMATO JUICE
tomato juice
# str.capitalize() > str의 첫 character를 대문자로
# > return value(!= None) > 원본 item 변화 없음
text1 = "hello"
print(text1.capitalize())
print(text1)
Hello
hello
# str.swapcase() > str의 대문자는 소문자로, 소문자는 대문자로
# > return value(!= None) > 원본 item 변화 없음
text1 = "Hi Minho"
print(text1.swapcase())
print(text1)
hI mINHO
Hi Minho
# string.lstrip() > stirng의 왼쪽에 있는 공백 전부 제거 > call by value
# 함수 연산의 결과만 보여줌 (원본 item에 반영X)
text = ' 123 123 '
print(text.lstrip())
print(text)
123 123
123 123
# string.rstrip() > string의 오른쪽에 있는 공백 전부 제거 > call by value
print(text.rstrip())
print(text)
123 123
123 123
# string.strip() > string의 양쪽에 있는 공백 전부 제거 > call by value
print(text.strip())
print(text)
123 123
123 123
# string.replace("old", "new") > 찾아바꾸기, string 내에서 "old"에 해당하는 문자열을 찾아 "new"로 전부 다 교체
# 공백 찾아 없애기에 쓸 수 있음
# call by value
print(text.replace('123','456'))
print(text)
456 456
123 123
# 가운데 공백을 줄일 수 있다
text.replace(" ","")
# null string ="" 따옴표 사이 띄어쓰기 없는 string
'123123'
# string.split("item") > 기준 string "item" 기준으로 쪼갠 문자열 list 반환
text2 = 'a b c'
text2.split('b')
['a ', ' c']
# 기준 입력하지 않으면 > ' ', \n, \t 등(white space)을 기준으로 쪼갬
text2.split()
['a', 'b', 'c']
# 두 character 이상(== string) > 기준 string "item"에 대입 가능
text3 = 'a,b,c,ddes'
print(text3.split("dde"))
['a,b,c,', 's']
# string의 길이 구하기 > len(string)
x = 'abcdefghijklmnopqrstuvwxyz'
len(x)
26
# index 0부터 시작 > 마지막 인덱스 번호 == 길이 -1
len(x) - 1
25
# stirng의 마지막 character를 len(string)을 활용한 인덱싱으로 출력 > string[len(string) - 1]
x[len(x) - 1]
'z'