목차
-
텍스트 데이터
-
텍스트 데이터 종류
-
파이썬 텍스트 데이터 관련 라이브러리
-
문자열
-
문자열 처리 연산
-
문자열 인덱싱, 슬라이싱
-
문자열 처리 메소드
-
문자열 포맷팅
-
format() 메소드
-
f-string
-
split() 메소드
-
join() 메소드
-
대문자와 소문자 변환
-
문자열 앞뒤 공백(특정문자) 제거
-
문자열 검색
-
문자열 카운트, 문자열 대체
-
워드 클라우드
-
워드 클라우드 : 중지어 제거
-
정규 표현식(Regular expression)
-
정규(표현)식
-
re.search() 함수
-
re.search() 함수 반환값
-
메타 문자 : 앵커
-
메타 문자
-
확장 정규식의 메타 문자
-
re.findall() 메소드
-
re.sub() 메소드
-
re.search 에서 해당 하는 단어만 출력
-
findall 함수 사용
텍스트 데이터
텍스트 데이터 종류
- 구조화된 문서 : HTML, XML, CSV, JSON 파일
- 구조화되지 않은 문서 : 자연어로 된 텍스트
파이썬 텍스트 데이터 관련 라이브러리
- 기본 라이브러리에서 제공하는 문자열 처리 함수
- 문자열 객체(str) 메소드
- string 모듈 → 문자열 상수 정의
- string.ascii uppercase, string.ascii_letters, string.digits
- 외부 모듈
- wordcloud → 워드 클라우드 생성
- re → 정규 표현식
- BeautifulSoup, csv, json, nltk 등
문자열
- 변경 불가능 자료형 → str
- 문자열 상수
- 작은 따옴표나, 따옴표로 묶음
- ex) ‘test’ == “test”
- ex) ‘I am not “human”.’
- 여러줄 문자열 상수는 따옴표 3개로 묶음
- ex)
여러 줄 문자열 상수
- ex)
- 작은 따옴표나, 따옴표로 묶음
- 이스케이프 문자
- 문자열 내부에서 명령어처럼 사용되는 문자
- \n → 줄 바꿈
- \t → 탭 간격 띄우기
- \ → 역슬래시 출력
- \’, \” ⇒ 따옴표 출력
- 문자열 내부에서 명령어처럼 사용되는 문자
문자열 처리 연산
- 문자열 처리 연산자
- 문자열 합치기 연산 (+) , 문자열 반복 연산 (*)
- 문자열 처리 함수
- len(s) → 문자열 길이 반환
- len(’Hello’) == 5
- min(s) → 문자열에서 코드값 최소 문자 반환
- min(’Hello’) == ‘H’
- max(s) → 문자열에서 코드값 최소 문자 반환
- max(’Hello’) == ‘o’
- len(s) → 문자열 길이 반환
문자열 인덱싱, 슬라이싱
- 문자열도 리스트나 튜플처럼 인덱싱, 슬라이싱 가능
- 문자열 인덱싱
- 문자열[i]
- i >= 0 → 문자열의 i+1 번째 문자 반환
- i < 0 → 문자열 뒤에서 -i 번째 문자 반환
- 문자열[i]
- 문자열 슬라이싱
- 문자열[s:e] → 문자열[s] 에서 문자열 [e-1] 사이의 부분 문자열 반환
- 문자열[:e] == 문자열[0:e]
- 문자열 [s:] == 문자열[s:n] ← n은 문자열의 크기
- 문자열[:] == 문자열[0:] == 문자열[0:n] == 문자열
문자열 처리 메소드
- 문자열 객체는 불변자료형
- 문자열 메소드는 새로운 문자열 반환
- str 클래스 메소드
- format() → 문자열 포맷팅 메소드
- split(), join() → 문자열 나누기, 합치기 메소드
- upper(), lower() → 대문자/소문자 변환 메소드
- strip(), lstrip(), rstrip() → 문자열의 위치 반환 메소드
- find(), index() → 문자열의 위치 반환 메소드
- count(), replace() → 문자열 카운트, 문자열 대체 메소드
문자열 포맷팅
- % 형식 지정 ⇒ “%d, %s” %(123, ‘Hello’)
- format 메소드
- f-string
format() 메소드
- 사용형식
- 형식지정문자열.format(데이터)
- 형식지정문자열에서 변수 값이 포함될 부분은 중괄호 삽입
- 중괄호 개수 만큼 format 메소드에 인자 값 전달
- 형식지정문자열.format(데이터)
- 형식 지정 문자열의 중괄호 사용 예
- 중괄호만 사용
- ‘{ }’.format(’test’)
- 중괄호와 인덱스(위치인자) 사용
- ‘{0}{1}’.format(’hello’,’world’)
- 중괄호와 변수명(키워드인자) 사용
- ‘{x}{y}’.format(x=’hello’, y=’world’)
- 중괄호와 인덱스 : 서식 기호 사용
- ‘{0:3d}’.format(10) == ‘%3d’%10
- ‘{0:.1f}’.format(3.14) == ‘%.1f’ %3.14
- 중괄호만 사용
a, b = 2, 3
print('{} * {} = {}'.format(a, b, a*b))
print('{0} * {1} = {2}'.format(a, b, a*b)) # 위치 인자
print('{a} * {b} = {c}'.format(a=a, b=b, c=a*b)) # 키워드 인자
print('{0} * {1} = {2:3d}'.format(a, b, a*b)) # 서식 기호, 3d
print('{0} / {1} = {2:.1f}'.format(a, b, a/b)) # 서식 기호, .1f
print('{0:<10} | {1:<10}'.format('hello', 'world')) # 왼쪽 정렬
print('{0:^10} | {1:^10}'.format('hello', 'world')) # 가운데 정렬
print('{0:>10} | {1:>10}'.format('hello', 'world')) # 오른쪽 정렬
2 * 3 = 6 2 * 3 = 6 2 * 3 = 6 2 * 3 = 6 2 / 3 = 0.7 hello | world
hello | world
hello | world
f-string
- 리눅스 쉘의 매개변수 확장과 유사 → ${변수}
- 사용형식 → f’{수식:서식}’
- 수식(변수)의 값으로 바뀜
- 서식 지정자
- 문자열(좌측정렬) s, 정수(우측정렬) d, 실수 (우측정렬) f
- ^10d (정수, 10칸, 좌측정렬)
- .1f (실수, 소수점 1자리)
- 파이썬 문자열 포맷팅 방법
- f-string → f’{x} * {y} = { x*y:2d}’
- format() 메소드 → ‘{0}{1} = {2:2d}’.format(x, y, xy}
- % 형식 지정자 → ‘%d * %d = %2d’ %(x,y,x*y)
x, y = 7, 9
print(x, '*', y, '=', x*y) # 가변인자 활용 문자열 포맷팅
print(f'{x} * {y} = {x*y}') # f-string 활용 문자열 포맷팅
print('{0} * {1} = {2}'.format(x, y, x*y)) # format() 활용 문자열 포맷팅
print('%d * %d = %d' %(x, y, x*y)) # %형식지정자 활용 문자열 포맷팅
r = 3.14
print(f'{r:.1f}', '{0:.1f}'.format(r), '%.1f' %r)
7 * 9 = 63 7 * 9 = 63 7 * 9 = 63 7 * 9 = 63 3.1 3.1 3.1
split() 메소드
- 문자열을 구분자(쉼표, 빈칸 등) 기준으로 분리한 문자열 리스트 반환
- ‘This is a test’.split() → [’This’, ‘is’, ‘a’ , ‘test’]
- ‘2021.12.25’.split() → [’2021’,’12’,’25’]
- split 인자에 아무값을 주지않으면 공백으로 분리
# split() 메소드
s1 = 'This is a test'
print(s1.split()) # 빈칸 기준으로 문자열 분리
s2 = '2021.12.25'
print(s2.split('.')) # 마침표 기준으로 문자열 분리
s3 = '01:39:27'
print(s3.split(':')) # 콜론 기준으로 문자열 분리
join() 메소드
- 호출 형식
- 구분자문자열.join(문자열 리스트)
- 문자열 리스트를 전달받아, 리스트의 모둔 문자열을 연결한 문자열 반환 → split() 메소드 반대기능
- 문자열을 연결할 때 구분자 문자열을 중간에 삽입
- ‘.’.join[’2021’,’12’,’25’] == ‘2021.12.25’
# join() 메소드
print('.'.join(['2021', '12', '25'])) # 문자열 연결
print(' '.join(['This', 'is', 'a', 'test'])) # 문자열 연결
print('-'.join('010.1234.5678'.split('.'))) # 구분자 변경
대문자와 소문자 변환
- lower() 메소드
- 문자열에 포함된 대문자를 소문자로 변환한 문자열 반환
- upper() 메소드
- 문자열에 포함된 소문자를 대문자로 변환한 문자열 반환
- capitalize() 메소드
- 문자열에서 첫번째 문자만 대문자를 변환한 문자열 반환
문자열 앞뒤 공백(특정문자) 제거
- strip() 메소드
- 문자열 앞뒤에 포함된 공백(특정문자)를 제거한 문자열 반환
- 공백이 아닌 특정문자를 제거하려면, 특정문자를 인자로 전달
- 문자열 앞뒤에 포함된 공백(특정문자)를 제거한 문자열 반환
- lstrip() 메소드
- 문자열 앞(좌측)에 포함된 공백(특정문자)를 제거한 문자열 반환
- rstrip() 메소드
- 문자열 뒤(우측)에 포함된 공백(특정문자)를 제거한 문자열 반환
문자열 검색
- find() 메소드
- 형식 → 문자열.find(찾을_문자열) 메소드
- 문자열에서 찾을 문자열을 검색해서 그 위치(인덱스)를 반환
- 찾는 문자열이 없으면 -1 반환
- 찾을 문자열이 여러 번 검색되면 첫번째 위치 반환
- index() 메소드
- 찾을 문자열이 있으면 그 위치 반환 → find() 메소드와 동일 기능
- 찾을 문자열이 없으면 오류(ValueError) 발생 → 예외 처리 필요
문자열 카운트, 문자열 대체
- count() 메소드
- 문자열에서 찾을 문자열을 빈도 수를 반환
- 없으면 0 반환
- replace() 메소드
- 문자열의 일부분을 다른 문자열로 대체한 문자열 반환
s1 = 'nice to meet you'
print(s1.count('o'), s1.count('e'), s1.count('a'))
s2 = 'Hello World'
print(s2.replace('Hello', 'Hi'))
replace 메소드 사용 시 원래 s2의 값은 변하지 않는다.
예제:
실습 ) 영문자열을 입력받아, 아래 항목 출력
- 대문자 개수
- 소문자 개수
- 숫자 개수
- 특수문자 개수
- 공백개수
st = input('영문자열을 입력하여 주세요')
low = 0; upp = 0; num = 0; spe = 0; space = 0
tmp = 0
for i in st: # 대문자
tmp = ord(i)
if True == (90 >= tmp >= 65) : # A~Z
upp += 1
else:
if True == (122 >= tmp >= 97) : # a~z
low += 1
else:
if True ==(57 >= tmp >=48): # 0~9
num += 1
else:
if tmp == 32: # 공백
space += 1
continue
spe += 1 # 공백, 대문자, 소문자, 숫자가 아닐때
print('대문자 개수 : ',upp)
print('소문자 개수 : ',low)
print('숫자 개수 : ',num)
print('특수문자 개수 : ',spe)
print('공백 개수 : ', space) # 공백 개수
워드 클라우드
- 텍스트 데이터 시각화 기술
- 각 단어의 크기가 빈도 또는 중요성을 나타냄
- matplotlib, pandas, wordcloud 모듈 필요
- 모듈 설치 : pip install wordcloud
- 워드 클라우드를 생성에 사용할 텍스트 준비
- wikipedia 모듈 사용
- 위키백과에서 텍스트 데이터를 가져옴
- 모듈 설치 : pip install wikipedia
- wikipedia 모듈 사용
Wikipedia에서 “Deep Learning” 에 대한 정보를 불러와서 워드클라우드를 통해 이미지화
# 위키백과에서 특정 주제로 검색한 텍스트 데이터 가져오기
import wikipedia
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 위키백과에서 "Deep Learning"을 주제로 설정
wiki = wikipedia.page('Deep Learning')
# 텍스트 데이터 내용 추출
text = wiki.content
# 워드 클라우드 객체 생성
wordcloud = WordCloud(width = 2000, height = 1500).generate(text)
# 워드 클라우드 이미지 크기 설정, 이미지 출력
plt.figure(figsize=(40, 30)) # 워드 클라우드 이미지 크기 설정
plt.imshow(wordcloud) # 워드 클라우드 이미지 출력
plt.show()
워드 클라우드 : 중지어 제거
- 중지어(Stop word) : 텍스트 데이터 중 자주 쓰이지만, 특별히 중요한 의미를 갖지 않는 단어
- 중지어 제거 : STOPWORDS 집합에 추가
from wordcloud import WordCloud, STOPWORDS
import wikipedia
import matplotlib.pyplot as plt
wiki = wikipedia.page('Deep Learning')
text = wiki.content
s_words = STOPWORDS.union( {'retrieved', 'archived', 'will', 'may', 'use', 'original', 'feature', 'using', 'CNN', 'DNN', 'layer'} )
wordcloud = WordCloud(width = 2000, height = 1500, stopwords = s_words).generate(text)
plt.figure(figsize=(40,30))
plt.imshow(wordcloud)
plt.show()
- 해당(불필요한) 단어를 제외하여 이미지를 만들어낸다
정규 표현식(Regular expression)
- 텍스트의 패턴을 인식하는 심볼 표기법
- POSIX 정규 표현식 메타 문자
- 앵커 메타문자 : ^(캐럿) , $(달러기호)
- 모든 문자 : . (도트)
- 대괄호 표현식 : [ ]
- 확장 정규 표현식 메타 문자
- 얼터네이션 : |
- 수량한정자 : ? , * , + , { }
정규(표현)식
- 파이썬에 정규식 사용을 위해 re 모듈 포함
- re 모듈에 포함된 정규식 사용 함수
- re.search( ) 함수
- 텍스트에서 정규식에 부합되는 부분이 있는지 검사
- re.findall( ) 함수
- 텍스트에서 정규식에 부합되는 모든 문자열을 찾아 리스트로 반환
- re.sub( ) 함수
- 텍스트에서 정규식에 부합되는 모든 문자열을 찾아 다른 문자열로 대체
- re.search( ) 함수
re.search() 함수
# 정규표현식 re.search 함수
import re
txt1 = "Hello World, Hi python"
txt2 = "Nice to meet you"
print(re.search('Hi', txt1)) # 일반 문자열도 정규식
print(re.search('To', txt2)) # 대소문자 구분한다.
- txt1 에 ‘Hi’라는 문자열이 있어서 객체가 만들어졌다, 그리고 해당 문자가 위치한 위치를 반환
- txt2에 “To” 는 없어서 객체가 만들어지지 않았다, 해당 함수는 대소문자 구분
re.search() 함수 반환값
- re.Match 객체 반환
- start( ) 메소드 → Match 객체 span 시작 인덱스 반환
- end( ) 메소드 → Match 객체 span 끝 인덱스 반환
- span( ) 메소드 → Match 객체 span 데이터(튜플) 반환
- group( ) 메소드 → Match 객체 match 문자열 반환
메타 문자 : 앵커
- 앵커 메타 문자
- ^(캐럿) 은 행의 시작 의미
- ex) ‘^zip’ → zip으로 시작하는 행/문장
- $(달러)는 행의 끝 의미
- ex) ‘txt$’ → txt로 끝나는 행/문장
import re
txt1 = "Hello World, Hi python"
txt2 = "Nice to meet you"
print(re.search('^Hi', txt1)) # Hi로 시작하는 문장?
print(re.search('^Nice', txt2)) # Niice로 시작하는 문장?
print(re.search('python$', txt1)) # python으로 끝나는 문장?
print(re.search('to$', txt2)) # to로 끝나는 문장?
메타 문자
- 도트 .
- 공백 문자 제외 어떤 문자로 일치하는 메타문자
- ex) ‘.grep’ → grep으로 끝나는 5문자 문자열
- 이스케이프문자 + d , w , s , S
- \d (숫자 하나) , \w (문자나 숫자 하나)
- \s (공백문자 하나) , \S (공백 제외 모든 문자 하나)
- 대괄호 [ ] 표현식
- 문자 집합을 표현
- 대괄호 표현식에서 특수문자
- ^(캐럿) : 부정 의미
- 예) ‘[^ef]grep’ → e나 f를 제외한 문자로 시작하는 grep
- -(대시) : 두 문자 사이의 범위 의미
- 대괄호 표현식에서 나머지 문자는 모두 일반 문자로 간주
import re
print(re.search('H..L' , 'HTML5')) # 도트 . 문자 사용 H로 시작하고 L로 끝나는 문자
print(re.search('CSS\d', 'CSS3')) # \d == [ 0~9 ] CSS + 숫자하나가 있는 문자
print(re.search('[hH]ello', 'hello')) # 대괄호 표현식 'h' or 'H' + ello 인 문자
print(re.search('\w\w[1-9]', 'ID9')) # \w == [0-9a-zA-Z] + [0-9a-zA-Z] + 1~9 인 문자
print(re.search('[A-F][A-F]\s\d', "AB 7")) # \s == 공백문자 A~F + A~F + 공백 + 숫자 인 문자
print(re.search('[^ABCD].[1-9]', 'E72')) # 대괄호 표현식 부정 표현 ABCD 를 제외한 1~9 인 문자
확장 정규식의 메타 문자
- 얼터네이션 |
- 여러 표현식 중 하나라도 일치하면 패턴 일치로 간주
- ex) ‘AAA|BBB’ → 비교 문자열이 AAA이거나 BBB이면 일치
- 수량한정자 : ?, * , + , { }
- ? 한정자
- 앞 항목이 없거나 한번만 나타나는 경우 → ? 앞 항목은 선택적
- ex) ‘+?[1-9]’ → 1에서 9, 혹은 +1에서 +9
-
- 한정자
- 앞 항목이 없거나 여러 번 나타나는 경우
- 한정자
-
- 한정자
- 앞 항목이 한번 이상 나타나는 경우
- 한정자
- { } 한정자
- 앞 항목이 지정된 횟수 만큼 나타나는 경우
- ex) {n} → 앞 항목이 n번 나타남
- ? 한정자
# 확장 정규식의 메타 문자
import re
print(re.search('hello|Hello', 'Hello')) # Alternation | (OR 연산, A 이거나 B 이거나)
print(re.search('\+?\d\d', '10')) # ? 한정자 \+는 (+)가 한번만 있거나 없어도 찾자라는 뜻, \d\d 는 0-9+0-9(숫자 두자리)를 의미
print(re.search('-[1-9][0-9]*', '-10')) # * 한정자 앞 항목이 없을수도 있고 여러번 있을때도 찾아줘
print(re.search('\+[1-9]\d+', '+39')) # + 한정자 (+)1~9,1~9
# ex)‘\+?[1-9]’-> 1에서 9, 혹은 +1에서 +9
# { } 한정자
print(re.search('0\d{2}-[1-9]\d{2}-\d{4}', '053-550-5518'))
# {n, m} 한정자
print(re.search('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', '127.0.0.1'))
- 실습
- 주민등록번호를 인식하는 정규표현식 구현
# 주민번호 인식 정규표현식
import re
print(re.search('\d{6}-[1234]\d{6}', '970301-2532321'))
print(re.search('\d{6}-[1234]\d{6}', '523301-5532321'))
- 실습
- 텍스트 파일을 읽어서 소괄호 숫자로 시작하는 모든 행 출
(숫자 1자리) 인 행 모두 출력한다.import re f = open('test1.txt') for line in f : line = line.rstrip() if re.search('^\([0-9]+\)', line): print(line)
re.findall() 메소드
- 호출 형식 → findall(정규식, 텍스트)
- 반환 : 문자열 리스트
- 텍스트에서 정규식에 부합하는 모든 문자열 목록 → 리스트 형식으로 반환
# re.findall() 메소드
import re
# 멀티라인 텍스트
text = """101 COM PythonProgramming
102 MAT LinearAlgebra
103 ENG ComputerEnglish"""
s = re.findall('\d+', text) # 1개 이상의 숫자 문자열을 리스트로 반환
print(s)
re.sub() 메소드
- 호출 형식 → sub(정규식, 대체문자열, 텍스트)
- 반환 : 변경된 문자열
- 텍스트에서 정규식에 부합하는 문자열을 대체문자열로 변경
# re.sub() 메소드
import re
s1 = 'I like dog'
print(re.sub('dog', 'cat', s1))
s2 = 'number = 1 2 3 4'
print(re.sub('[0-9]+', '*', s2))
re.search 에서 해당 하는 단어만 출력
- search 함수를 사용하면 해당 오브젝트 형태로 출력이 된다.
- match에 해당 하는 값만 출력해서 보고 싶다면 re.search(”조건식, Value”).group()
- .group() 함수를 사용하면 Match 되는 값만 볼 수 있다.
findall 함수 사용
- re.findall(”(\w+)”) : 문자열 , 숫자를 하나씩 추출 [특수문자는 미포함]
- re.findall(”(^w+)”) : 문자열, 숫자를 제외한 문자 추출
텍스트 데이터
텍스트 데이터 종류
- 구조화된 문서 : HTML, XML, CSV, JSON 파일
- 구조화되지 않은 문서 : 자연어로 된 텍스트
파이썬 텍스트 데이터 관련 라이브러리
- 기본 라이브러리에서 제공하는 문자열 처리 함수
- 문자열 객체(str) 메소드
- string 모듈 → 문자열 상수 정의
- string.ascii uppercase, string.ascii_letters, string.digits
- 외부 모듈
- wordcloud → 워드 클라우드 생성
- re → 정규 표현식
- BeautifulSoup, csv, json, nltk 등
문자열
- 변경 불가능 자료형 → str
- 문자열 상수
- 작은 따옴표나, 따옴표로 묶음
- ex) ‘test’ == “test”
- ex) ‘I am not “human”.’
- 여러줄 문자열 상수는 따옴표 3개로 묶음
- ex)
여러 줄 문자열 상수
- ex)
- 작은 따옴표나, 따옴표로 묶음
- 이스케이프 문자
- 문자열 내부에서 명령어처럼 사용되는 문자
- \n → 줄 바꿈
- \t → 탭 간격 띄우기
- \ → 역슬래시 출력
- \’, \” ⇒ 따옴표 출력
- 문자열 내부에서 명령어처럼 사용되는 문자
문자열 처리 연산
- 문자열 처리 연산자
- 문자열 합치기 연산 (+) , 문자열 반복 연산 (*)
- 문자열 처리 함수
- len(s) → 문자열 길이 반환
- len(’Hello’) == 5
- min(s) → 문자열에서 코드값 최소 문자 반환
- min(’Hello’) == ‘H’
- max(s) → 문자열에서 코드값 최소 문자 반환
- max(’Hello’) == ‘o’
- len(s) → 문자열 길이 반환
문자열 인덱싱, 슬라이싱
- 문자열도 리스트나 튜플처럼 인덱싱, 슬라이싱 가능
- 문자열 인덱싱
- 문자열[i]
- i >= 0 → 문자열의 i+1 번째 문자 반환
- i < 0 → 문자열 뒤에서 -i 번째 문자 반환
- 문자열[i]
- 문자열 슬라이싱
- 문자열[s:e] → 문자열[s] 에서 문자열 [e-1] 사이의 부분 문자열 반환
- 문자열[:e] == 문자열[0:e]
- 문자열 [s:] == 문자열[s:n] ← n은 문자열의 크기
- 문자열[:] == 문자열[0:] == 문자열[0:n] == 문자열
문자열 처리 메소드
- 문자열 객체는 불변자료형
- 문자열 메소드는 새로운 문자열 반환
- str 클래스 메소드
- format() → 문자열 포맷팅 메소드
- split(), join() → 문자열 나누기, 합치기 메소드
- upper(), lower() → 대문자/소문자 변환 메소드
- strip(), lstrip(), rstrip() → 문자열의 위치 반환 메소드
- find(), index() → 문자열의 위치 반환 메소드
- count(), replace() → 문자열 카운트, 문자열 대체 메소드
문자열 포맷팅
- % 형식 지정 ⇒ “%d, %s” %(123, ‘Hello’)
- format 메소드
- f-string
format() 메소드
- 사용형식
- 형식지정문자열.format(데이터)
- 형식지정문자열에서 변수 값이 포함될 부분은 중괄호 삽입
- 중괄호 개수 만큼 format 메소드에 인자 값 전달
- 형식지정문자열.format(데이터)
- 형식 지정 문자열의 중괄호 사용 예
- 중괄호만 사용
- ‘{ }’.format(’test’)
- 중괄호와 인덱스(위치인자) 사용
- ‘{0}{1}’.format(’hello’,’world’)
- 중괄호와 변수명(키워드인자) 사용
- ‘{x}{y}’.format(x=’hello’, y=’world’)
- 중괄호와 인덱스 : 서식 기호 사용
- ‘{0:3d}’.format(10) == ‘%3d’%10
- ‘{0:.1f}’.format(3.14) == ‘%.1f’ %3.14
- 중괄호만 사용
a, b = 2, 3
print('{} * {} = {}'.format(a, b, a*b))
print('{0} * {1} = {2}'.format(a, b, a*b)) # 위치 인자
print('{a} * {b} = {c}'.format(a=a, b=b, c=a*b)) # 키워드 인자
print('{0} * {1} = {2:3d}'.format(a, b, a*b)) # 서식 기호, 3d
print('{0} / {1} = {2:.1f}'.format(a, b, a/b)) # 서식 기호, .1f
print('{0:<10} | {1:<10}'.format('hello', 'world')) # 왼쪽 정렬
print('{0:^10} | {1:^10}'.format('hello', 'world')) # 가운데 정렬
print('{0:>10} | {1:>10}'.format('hello', 'world')) # 오른쪽 정렬
2 * 3 = 6 2 * 3 = 6 2 * 3 = 6 2 * 3 = 6 2 / 3 = 0.7 hello | world
hello | world
hello | world
f-string
- 리눅스 쉘의 매개변수 확장과 유사 → ${변수}
- 사용형식 → f’{수식:서식}’
- 수식(변수)의 값으로 바뀜
- 서식 지정자
- 문자열(좌측정렬) s, 정수(우측정렬) d, 실수 (우측정렬) f
- ^10d (정수, 10칸, 좌측정렬)
- .1f (실수, 소수점 1자리)
- 파이썬 문자열 포맷팅 방법
- f-string → f’{x} * {y} = { x*y:2d}’
- format() 메소드 → ‘{0}{1} = {2:2d}’.format(x, y, xy}
- % 형식 지정자 → ‘%d * %d = %2d’ %(x,y,x*y)
x, y = 7, 9
print(x, '*', y, '=', x*y) # 가변인자 활용 문자열 포맷팅
print(f'{x} * {y} = {x*y}') # f-string 활용 문자열 포맷팅
print('{0} * {1} = {2}'.format(x, y, x*y)) # format() 활용 문자열 포맷팅
print('%d * %d = %d' %(x, y, x*y)) # %형식지정자 활용 문자열 포맷팅
r = 3.14
print(f'{r:.1f}', '{0:.1f}'.format(r), '%.1f' %r)
7 * 9 = 63 7 * 9 = 63 7 * 9 = 63 7 * 9 = 63 3.1 3.1 3.1
split() 메소드
- 문자열을 구분자(쉼표, 빈칸 등) 기준으로 분리한 문자열 리스트 반환
- ‘This is a test’.split() → [’This’, ‘is’, ‘a’ , ‘test’]
- ‘2021.12.25’.split() → [’2021’,’12’,’25’]
- split 인자에 아무값을 주지않으면 공백으로 분리
# split() 메소드
s1 = 'This is a test'
print(s1.split()) # 빈칸 기준으로 문자열 분리
s2 = '2021.12.25'
print(s2.split('.')) # 마침표 기준으로 문자열 분리
s3 = '01:39:27'
print(s3.split(':')) # 콜론 기준으로 문자열 분리
join() 메소드
- 호출 형식
- 구분자문자열.join(문자열 리스트)
- 문자열 리스트를 전달받아, 리스트의 모둔 문자열을 연결한 문자열 반환 → split() 메소드 반대기능
- 문자열을 연결할 때 구분자 문자열을 중간에 삽입
- ‘.’.join[’2021’,’12’,’25’] == ‘2021.12.25’
# join() 메소드
print('.'.join(['2021', '12', '25'])) # 문자열 연결
print(' '.join(['This', 'is', 'a', 'test'])) # 문자열 연결
print('-'.join('010.1234.5678'.split('.'))) # 구분자 변경
대문자와 소문자 변환
- lower() 메소드
- 문자열에 포함된 대문자를 소문자로 변환한 문자열 반환
- upper() 메소드
- 문자열에 포함된 소문자를 대문자로 변환한 문자열 반환
- capitalize() 메소드
- 문자열에서 첫번째 문자만 대문자를 변환한 문자열 반환
문자열 앞뒤 공백(특정문자) 제거
- strip() 메소드
- 문자열 앞뒤에 포함된 공백(특정문자)를 제거한 문자열 반환
- 공백이 아닌 특정문자를 제거하려면, 특정문자를 인자로 전달
- 문자열 앞뒤에 포함된 공백(특정문자)를 제거한 문자열 반환
- lstrip() 메소드
- 문자열 앞(좌측)에 포함된 공백(특정문자)를 제거한 문자열 반환
- rstrip() 메소드
- 문자열 뒤(우측)에 포함된 공백(특정문자)를 제거한 문자열 반환
문자열 검색
- find() 메소드
- 형식 → 문자열.find(찾을_문자열) 메소드
- 문자열에서 찾을 문자열을 검색해서 그 위치(인덱스)를 반환
- 찾는 문자열이 없으면 -1 반환
- 찾을 문자열이 여러 번 검색되면 첫번째 위치 반환
- index() 메소드
- 찾을 문자열이 있으면 그 위치 반환 → find() 메소드와 동일 기능
- 찾을 문자열이 없으면 오류(ValueError) 발생 → 예외 처리 필요
문자열 카운트, 문자열 대체
- count() 메소드
- 문자열에서 찾을 문자열을 빈도 수를 반환
- 없으면 0 반환
- replace() 메소드
- 문자열의 일부분을 다른 문자열로 대체한 문자열 반환
s1 = 'nice to meet you'
print(s1.count('o'), s1.count('e'), s1.count('a'))
s2 = 'Hello World'
print(s2.replace('Hello', 'Hi'))
replace 메소드 사용 시 원래 s2의 값은 변하지 않는다.
예제:
실습 ) 영문자열을 입력받아, 아래 항목 출력
- 대문자 개수
- 소문자 개수
- 숫자 개수
- 특수문자 개수
- 공백개수
st = input('영문자열을 입력하여 주세요')
low = 0; upp = 0; num = 0; spe = 0; space = 0
tmp = 0
for i in st: # 대문자
tmp = ord(i)
if True == (90 >= tmp >= 65) : # A~Z
upp += 1
else:
if True == (122 >= tmp >= 97) : # a~z
low += 1
else:
if True ==(57 >= tmp >=48): # 0~9
num += 1
else:
if tmp == 32: # 공백
space += 1
continue
spe += 1 # 공백, 대문자, 소문자, 숫자가 아닐때
print('대문자 개수 : ',upp)
print('소문자 개수 : ',low)
print('숫자 개수 : ',num)
print('특수문자 개수 : ',spe)
print('공백 개수 : ', space) # 공백 개수
워드 클라우드
- 텍스트 데이터 시각화 기술
- 각 단어의 크기가 빈도 또는 중요성을 나타냄
- matplotlib, pandas, wordcloud 모듈 필요
- 모듈 설치 : pip install wordcloud
- 워드 클라우드를 생성에 사용할 텍스트 준비
- wikipedia 모듈 사용
- 위키백과에서 텍스트 데이터를 가져옴
- 모듈 설치 : pip install wikipedia
- wikipedia 모듈 사용
Wikipedia에서 “Deep Learning” 에 대한 정보를 불러와서 워드클라우드를 통해 이미지화
# 위키백과에서 특정 주제로 검색한 텍스트 데이터 가져오기
import wikipedia
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 위키백과에서 "Deep Learning"을 주제로 설정
wiki = wikipedia.page('Deep Learning')
# 텍스트 데이터 내용 추출
text = wiki.content
# 워드 클라우드 객체 생성
wordcloud = WordCloud(width = 2000, height = 1500).generate(text)
# 워드 클라우드 이미지 크기 설정, 이미지 출력
plt.figure(figsize=(40, 30)) # 워드 클라우드 이미지 크기 설정
plt.imshow(wordcloud) # 워드 클라우드 이미지 출력
plt.show()
워드 클라우드 : 중지어 제거
- 중지어(Stop word) : 텍스트 데이터 중 자주 쓰이지만, 특별히 중요한 의미를 갖지 않는 단어
- 중지어 제거 : STOPWORDS 집합에 추가
from wordcloud import WordCloud, STOPWORDS
import wikipedia
import matplotlib.pyplot as plt
wiki = wikipedia.page('Deep Learning')
text = wiki.content
s_words = STOPWORDS.union( {'retrieved', 'archived', 'will', 'may', 'use', 'original', 'feature', 'using', 'CNN', 'DNN', 'layer'} )
wordcloud = WordCloud(width = 2000, height = 1500, stopwords = s_words).generate(text)
plt.figure(figsize=(40,30))
plt.imshow(wordcloud)
plt.show()
- 해당(불필요한) 단어를 제외하여 이미지를 만들어낸다
정규 표현식(Regular expression)
- 텍스트의 패턴을 인식하는 심볼 표기법
- POSIX 정규 표현식 메타 문자
- 앵커 메타문자 : ^(캐럿) , $(달러기호)
- 모든 문자 : . (도트)
- 대괄호 표현식 : [ ]
- 확장 정규 표현식 메타 문자
- 얼터네이션 : |
- 수량한정자 : ? , * , + , { }
정규(표현)식
- 파이썬에 정규식 사용을 위해 re 모듈 포함
- re 모듈에 포함된 정규식 사용 함수
- re.search( ) 함수
- 텍스트에서 정규식에 부합되는 부분이 있는지 검사
- re.findall( ) 함수
- 텍스트에서 정규식에 부합되는 모든 문자열을 찾아 리스트로 반환
- re.sub( ) 함수
- 텍스트에서 정규식에 부합되는 모든 문자열을 찾아 다른 문자열로 대체
- re.search( ) 함수
re.search() 함수
# 정규표현식 re.search 함수
import re
txt1 = "Hello World, Hi python"
txt2 = "Nice to meet you"
print(re.search('Hi', txt1)) # 일반 문자열도 정규식
print(re.search('To', txt2)) # 대소문자 구분한다.
- txt1 에 ‘Hi’라는 문자열이 있어서 객체가 만들어졌다, 그리고 해당 문자가 위치한 위치를 반환
- txt2에 “To” 는 없어서 객체가 만들어지지 않았다, 해당 함수는 대소문자 구분
re.search() 함수 반환값
- re.Match 객체 반환
- start( ) 메소드 → Match 객체 span 시작 인덱스 반환
- end( ) 메소드 → Match 객체 span 끝 인덱스 반환
- span( ) 메소드 → Match 객체 span 데이터(튜플) 반환
- group( ) 메소드 → Match 객체 match 문자열 반환
메타 문자 : 앵커
- 앵커 메타 문자
- ^(캐럿) 은 행의 시작 의미
- ex) ‘^zip’ → zip으로 시작하는 행/문장
- $(달러)는 행의 끝 의미
- ex) ‘txt$’ → txt로 끝나는 행/문장
import re
txt1 = "Hello World, Hi python"
txt2 = "Nice to meet you"
print(re.search('^Hi', txt1)) # Hi로 시작하는 문장?
print(re.search('^Nice', txt2)) # Niice로 시작하는 문장?
print(re.search('python$', txt1)) # python으로 끝나는 문장?
print(re.search('to$', txt2)) # to로 끝나는 문장?
메타 문자
- 도트 .
- 공백 문자 제외 어떤 문자로 일치하는 메타문자
- ex) ‘.grep’ → grep으로 끝나는 5문자 문자열
- 이스케이프문자 + d , w , s , S
- \d (숫자 하나) , \w (문자나 숫자 하나)
- \s (공백문자 하나) , \S (공백 제외 모든 문자 하나)
- 대괄호 [ ] 표현식
- 문자 집합을 표현
- 대괄호 표현식에서 특수문자
- ^(캐럿) : 부정 의미
- 예) ‘[^ef]grep’ → e나 f를 제외한 문자로 시작하는 grep
- -(대시) : 두 문자 사이의 범위 의미
- 대괄호 표현식에서 나머지 문자는 모두 일반 문자로 간주
import re
print(re.search('H..L' , 'HTML5')) # 도트 . 문자 사용 H로 시작하고 L로 끝나는 문자
print(re.search('CSS\d', 'CSS3')) # \d == [ 0~9 ] CSS + 숫자하나가 있는 문자
print(re.search('[hH]ello', 'hello')) # 대괄호 표현식 'h' or 'H' + ello 인 문자
print(re.search('\w\w[1-9]', 'ID9')) # \w == [0-9a-zA-Z] + [0-9a-zA-Z] + 1~9 인 문자
print(re.search('[A-F][A-F]\s\d', "AB 7")) # \s == 공백문자 A~F + A~F + 공백 + 숫자 인 문자
print(re.search('[^ABCD].[1-9]', 'E72')) # 대괄호 표현식 부정 표현 ABCD 를 제외한 1~9 인 문자
확장 정규식의 메타 문자
- 얼터네이션 |
- 여러 표현식 중 하나라도 일치하면 패턴 일치로 간주
- ex) ‘AAA|BBB’ → 비교 문자열이 AAA이거나 BBB이면 일치
- 수량한정자 : ?, * , + , { }
- ? 한정자
- 앞 항목이 없거나 한번만 나타나는 경우 → ? 앞 항목은 선택적
- ex) ‘+?[1-9]’ → 1에서 9, 혹은 +1에서 +9
-
- 한정자
- 앞 항목이 없거나 여러 번 나타나는 경우
- 한정자
-
- 한정자
- 앞 항목이 한번 이상 나타나는 경우
- 한정자
- { } 한정자
- 앞 항목이 지정된 횟수 만큼 나타나는 경우
- ex) {n} → 앞 항목이 n번 나타남
- ? 한정자
# 확장 정규식의 메타 문자
import re
print(re.search('hello|Hello', 'Hello')) # Alternation | (OR 연산, A 이거나 B 이거나)
print(re.search('\+?\d\d', '10')) # ? 한정자 \+는 (+)가 한번만 있거나 없어도 찾자라는 뜻, \d\d 는 0-9+0-9(숫자 두자리)를 의미
print(re.search('-[1-9][0-9]*', '-10')) # * 한정자 앞 항목이 없을수도 있고 여러번 있을때도 찾아줘
print(re.search('\+[1-9]\d+', '+39')) # + 한정자 (+)1~9,1~9
# ex)‘\+?[1-9]’-> 1에서 9, 혹은 +1에서 +9
# { } 한정자
print(re.search('0\d{2}-[1-9]\d{2}-\d{4}', '053-550-5518'))
# {n, m} 한정자
print(re.search('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', '127.0.0.1'))
- 실습
- 주민등록번호를 인식하는 정규표현식 구현
# 주민번호 인식 정규표현식
import re
print(re.search('\d{6}-[1234]\d{6}', '970301-2532321'))
print(re.search('\d{6}-[1234]\d{6}', '523301-5532321'))
- 실습
- 텍스트 파일을 읽어서 소괄호 숫자로 시작하는 모든 행 출
(숫자 1자리) 인 행 모두 출력한다.import re f = open('test1.txt') for line in f : line = line.rstrip() if re.search('^\([0-9]+\)', line): print(line)
re.findall() 메소드
- 호출 형식 → findall(정규식, 텍스트)
- 반환 : 문자열 리스트
- 텍스트에서 정규식에 부합하는 모든 문자열 목록 → 리스트 형식으로 반환
# re.findall() 메소드
import re
# 멀티라인 텍스트
text = """101 COM PythonProgramming
102 MAT LinearAlgebra
103 ENG ComputerEnglish"""
s = re.findall('\d+', text) # 1개 이상의 숫자 문자열을 리스트로 반환
print(s)
re.sub() 메소드
- 호출 형식 → sub(정규식, 대체문자열, 텍스트)
- 반환 : 변경된 문자열
- 텍스트에서 정규식에 부합하는 문자열을 대체문자열로 변경
# re.sub() 메소드
import re
s1 = 'I like dog'
print(re.sub('dog', 'cat', s1))
s2 = 'number = 1 2 3 4'
print(re.sub('[0-9]+', '*', s2))
re.search 에서 해당 하는 단어만 출력
- search 함수를 사용하면 해당 오브젝트 형태로 출력이 된다.
- match에 해당 하는 값만 출력해서 보고 싶다면 re.search(”조건식, Value”).group()
- .group() 함수를 사용하면 Match 되는 값만 볼 수 있다.
findall 함수 사용
- re.findall(”(\w+)”) : 문자열 , 숫자를 하나씩 추출 [특수문자는 미포함]
- re.findall(”(^w+)”) : 문자열, 숫자를 제외한 문자 추출