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. 가변자료가 들어갈 자리(...)에 구멍(%자료형)을 낸다.
  2. 구멍이 뚫린 문자열 뒤에 %로 연결 > 집어넣을 값을 적는다.

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'