Python 라이브러리 공부 기록 01. 텍스트 처리 서비스
카테고리: Python
💡
파이썬에서 자주 쓰이는 라이브러리, 통계, 데이터 분석에 유용한 라이브러리들을 학습하고 정리한 페이지입니다.
관심분야인 야구에 관한 응용문제를 직접 만들어 풀어보며 학습했습니다.
01. 텍스트 처리 서비스
01-01. textwrap
textwrap.shorten
함수는 문자열을 특정길이에 맞게 말줄임을 할 때 사용하는 함수이다.
width
매개변수를 15로 설정하면, 15글자만이 출력이 된다. 이 때 축약을 의미하는 […]도 15에 포함된다. 또한 중간에 문자가 끊기지 않고 출력되게 하기 위해 15로 설정하더라도 그보다 짧거나 길 수가 있다.
import textwrap
print(textwrap.shorten("군생활은 길고, 말년은 더 길다", width=15))
군생활은 길고, [...]
#길이가 15이면 '군생활은 길고, 말[...]'이 될 텐데 이렇게 문자가 끊기는 것을 방지하기 위해 14글자만 출력됐다.
placeholder
매개변수를 무엇으로 설정하느냐에 따라 축약표시가 달라진다.
print(textwrap.shorten("군생활은 길고, 말년은 더 길다", width=15, placeholder='~~~'))
군생활은 길고, 말년은~~~
textwrap.fill
함수는 문자열을 특정길이에 맞게 줄바꿈을 할 때 사용한다. width
매개변수에 입력한 바이트수를 기준으로 줄바꿈을 한다.
text = "유구한 역사와 전통에 빛나는 우리 대한국민은 3·1운동으로 건립된 대한민국임시정부의 법통과 불의에 항거한 4·19민주이념을 계승하고, 조국의 민주개혁과 평화적 통일의 사명에 입각하여 정의·인도와 동포애로써 민족의 단결을 공고히 하고, 모든 사회적 폐습과 불의를 타파하며, 자율과 조화를 바탕으로 자유민주적 기본질서를 더욱 확고히 하여 정치·경제·사회·문화의 모든 영역에 있어서 각인의 기회를 균등히 하고, 능력을 최고도로 발휘하게 하며, 자유와 권리에 따르는 책임과 의무를 완수하게 하여, 안으로는 국민생활의 균등한 향상을 기하고 밖으로는 항구적인 세계평화와 인류공영에 이바지함으로써 우리들과 우리들의 자손의 안전과 자유와 행복을 영원히 확보할 것을 다짐하면서 1948년 7월 12일에 제정되고 8차에 걸쳐 개정된 헌법을 이제 국회의 의결을 거쳐 국민투표에 의하여 개정한다."
import textwrap
slicing = textwrap.fill(text,width=30)
print(slicing)
유구한 역사와 전통에 빛나는 우리 대한국민은
3·1운동으로 건립된 대한민국임시정부의 법통과 불의에
항거한 4·19민주이념을 계승하고, 조국의 민주개혁과
평화적 통일의 사명에 입각하여 정의·인도와 동포애로써
민족의 단결을 공고히 하고, 모든 사회적 폐습과 불의를
타파하며, 자율과 조화를 바탕으로 자유민주적 기본질서를
더욱 확고히 하여 정치·경제·사회·문화의 모든 영역에
있어서 각인의 기회를 균등히 하고, 능력을 최고도로
발휘하게 하며, 자유와 권리에 따르는 책임과 의무를
완수하게 하여, 안으로는 국민생활의 균등한 향상을
기하고 밖으로는 항구적인 세계평화와 인류공영에
이바지함으로써 우리들과 우리들의 자손의 안전과 자유와
행복을 영원히 확보할 것을 다짐하면서 1948년 7월
12일에 제정되고 8차에 걸쳐 개정된 헌법을 이제
국회의 의결을 거쳐 국민투표에 의하여 개정한다.
01-02. re - 정규표현식
아래와 같은 텍스트에 포함된 주민번호 뒷자리를 *문자로 변경하려 한다. 만약 평범하게 이 문제를 해결하려면 텍스트를 split
하고, for
반복문을 사용하여 조건문을 걸어 복잡한 코드를 작성해야 한다.
하지만 re
모듈을 사용하면 보다 간단하게 해결할 수 있다.
홍길동의 주민번호는 800905-1049118 입니다.
그리고 고길동의 주민번호는 700905-1059119 입니다.
그렇다면 누가 형님일까요?
import re
data = """
홍길동의 주민번호는 800905-1049118 입니다.
그리고 고길동의 주민번호는 700905-1059119 입니다.
그렇다면 누가 형님일까요?
"""
pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub("\g<1>-*******", data))
#결과
홍길동의 주민번호는 800905-******* 입니다.
그리고 고길동의 주민번호는 700905-******* 입니다.
그렇다면 누가 형님일까요?
compile
뒤에 작성한 문자열을 정규표현식이라고 한다. compile
로 만든 객체(pat)에 sub
함수를 사용하면 이 정규표현식의 문자열 일부분을 *로 바꿀 수 있다.
sub
함수의 \g<1>
은 정규표현식과 매치된 문자열 중 첫번째 그룹을 의미한다. 이렇게 그룹을 지정하기 위해 정규표현식에서 (\d{6})
처럼 괄호를 묶어 그룹을 나타내줬다.
❓ 문제.
아래 텍스트에서 군번의 뒷 4자리를 * 표시로 처리하라.
”김희준 상병의 군번은 21-70003973입니다.
홍길동 일병의 군번은 21-72004846입니다.”
💡 정답.
import re
data = """
김희준 상병의 군번은 21-70003973입니다.
홍길동 일병의 군번은 21-72004846입니다.
"""
num = re.compile("(\d{2}[-]\d{4})\d{4}")
print(num.sub("\g<1>****", data))
#결과
김희준 상병의 군번은 21-7000****입니다.
홍길동 일병의 군번은 21-7200****입니다.