11월에 AI 교육을 들으러 가기 위해 파이썬 공부를 다시 시작했는데, 결국 교육을 못 가게 되었다.(회사가 못가게함)
기분이 더러워서 때려치우려 했지만, 그래도 계속하려 한다.
그래야 지옥에서 벗어날 기회가 주어질 테니까.
‘점프 투 파이썬’ 저자님은 라이브러리 예제도 친절하게 온라인으로 제공해주셨다.
파이썬 라이브러리로 공부해도 되지만, 한국인이 설명해주는 것만큼 친절하지는 않다.
책은 윈도우 기준으로 작성되어 있지만, 나는 맥북을 사용하기 때문에 맥OS 사용자분들은 내 블로그를 참고하시면 될 것 같다.
001. 문자열을 줄여 표시하려면? ― textwrap.shorten
- 긴 문장을 화면에 다 보여주기 부담스러울 때 사용. 단어 단위로 말줄임 처리를 할 수 있음.
- 글자 수가 아니라 문맥을 지켜주는 게 포인트!
| 구분 | 설명/예시 | 결과 |
| 소속 모듈 | textwrap (표준 라이브러리, 추가 설치 불필요) | |
| 함수 이름 | textwrap.shorten(text, width, placeholder='...') | |
| 기능 요약 | 긴 문자열을 지정한 길이(width)에 맞게 단어 단위로 줄이고, 생략 기호(placeholder)를 붙임 |
|
| 매개변수 | - text: 줄일 문자열 - width: 결과 문자열 최대 길이, 표시 푝 개념 (생략기호 포함) - placeholder: 잘린 부분에 붙일 문자열(기본 '...') |
|
| 동작 원리 | - 단어 단위로 자름 (문자 단위 X) - 문자열 앞뒤 공백 자동 제거 - 단어 사이의 여러 공백 → 하나로 축소 |
|
| 반환값 | 잘린 문자열 (str) | |
| 주의사항 | - 단어 중간은 절대 자르지 않음 - 너무 짧은 width는 ...만 출력될 수 있음 - 한글은 공백 기준으로 자름 (글자수 기준 아님) |
|
| 기본 사용 예 | import textwrap text = "파이썬은 쉽고 강력한 프로그래밍 언어입니다." result = textwrap.shorten(text, width=20, placeholder='...') print(result) |
파이썬은 쉽고... |
| 다른 말줄임 기호 사용 |
placeholder="~~~" 처럼 변경 가능 import textwrap text = "이 문장은 너무 길어서 잘려야 합니다." print(textwrap.shorten(text, width=25, placeholder='~~~')) |
이 문장은 너무~~~ |
| 영어 문장 요약 | 띄어쓰기 기준이라 문장 자연스럽게 유지됨 import textwrap text = "Python is a simple yet powerful language for everyone." print(textwrap.shorten(text, width=30)) |
Python is a simple yet... |
| 글자 수 기준으로 자르고 싶을 때 | text[:n] + "..." 처럼 슬라이싱으로 직접 처리 python text = "파이썬은 쉽고 강력한 언어입니다." print(text[:10] + "...") # 인덱스 10전까지 텍스트 나열 |
파이썬은 쉽고 강... |
002. 긴 문장을 줄 바꿈하려면? ― textwrap.wrap
- 길이가 긴 문장을 출력하거나 파일로 저장할 때, 자동으로 적당한 폭(width) 마다 줄을 바꿔주고 싶을 때 사용하는 함수
- textwrap.wrap()은 긴 문장을 리스트로 잘라서 줄 바꿈 처리하고, '\n'.join() 또는 fill()을 쓰면 실제 개행된 문장으로 출력할 수 있다.
| 구분 | 설명 | 결과 |
| 소속 모듈 | textwrap (표준 라이브러리) | |
| 함수 이름 | textwrap.wrap(text, width=70, **kwargs) | |
| 기능 요약 | 문자열을 지정한 길이(width)마다 줄 바꿈하여 리스트(list) 로 반환 | ![]() |
| 매개변수 | - text: 줄바꿈할 문자열 - width: 한 줄에 포함할 최대 문자 수 (기본값 70) - expand_tabs: 탭을 공백으로 바꿀지 여부 (기본값 True) - replace_whitespace: 여러 공백을 하나로 합칠지 (기본값 True) - drop_whitespace: 줄 끝/시작의 공백 제거 여부 (기본값 True) |
|
| 동작 원리 | - 지정한 폭(width)마다 단어 단위로 줄 바꿈 - 결과는 문자열이 아니라 문자열 리스트 형태로 반환됨 |
|
| 반환값 | 줄 바뀐 문자열들의 리스트 (list[str]) | |
| 주의사항 | - 단어 중간을 자르지 않음 - 줄마다 공백 자동 정리 - 실제로 개행 문자(\n)를 추가하려면 '\n'.join()으로 합쳐야 함 |
|
| 기본 사용 | - 한 줄 폭 지정 textwrap.wrap(text, width=30) |
30문자 단위로 줄바꿈 |
| 개행 문자 포함 출력 | - '\n'.join()으로 합치기 "\n".join(textwrap.wrap(text, 20)) |
실제 줄바꿈된 문자열 출력 |
| 들여쓰기 추가 | - textwrap.fill() 사용 (wrap + join 결합) print(textwrap.fill(text, width=20, initial_indent=' ')) |
자동 줄바꿈 + 들여쓰기 |
ex)
| 예시1 | import textwrap text = "파이썬은 쉽고 강력한 프로그래밍 언어입니다. 여러 줄로 출력하려면 textwrap.wrap을 사용할 수 있습니다." wrapped = textwrap.wrap(text, width=20) ① print(wrapped) # 리스트 형태 ② print("\n".join(wrapped)) # 실제 줄 바꿈된 문자열 출력 |
| 결과1 | ① ['파이썬은 쉽고 강력한 프로그래밍', '언어입니다. 여러 줄로 출력하려면', 'textwrap.wrap을 사용할 수', '있습니다.'] ② 파이썬은 쉽고 강력한 프로그래밍 언어입니다. 여러 줄로 출력하려면 textwrap.wrap을 사용할 수 있습니다. |
| 예시2 | import textwrap text = "파이썬은 쉽고 강력한 프로그래밍 언어입니다. 여러 줄로 출력하려면 textwrap.fill을 사용할 수 있습니다." wrapped =textwrap.fill(text, width=20) print(wrapped) |
| 결과2 | 파이썬은 쉽고 강력한 프로그래밍 언어입니다. 여러 줄로 출력하려면 textwrap.fill을 사용할 수 있습니다. |
003. 정규표현식으로 개인정보를 보호하려면? ― re
- re.compile + re.sub(치환 함수) 조합으로 찾고 → 남길 부분만 보존 → 나머지 마스킹.
저장·출력 직전 단계에서 일괄 적용하는 게 핵심!
📘 핵심 한눈에 보기
| 구분 | 설명 |
| 모듈 | re (표준 라이브러리) |
| 주요 함수 | re.sub(pattern, repl, s): 패턴→문자열 치환 re.findall(패턴 모두 추출) re.compile(패턴을 미리 “준비(컴파일)”해서 반복 사용 시 빠르고 깔끔하게 쓸 수 있게 해주는 도구) re.subn((새문자열, 바꾼개수) 형태로 반환) |
| 기본 아이디어 | 정규식 패턴으로 PII를 찾고, re.sub의 치환 함수(lambda) 로 일부만 남기고 마스킹 |
| 권장 흐름 | (1) 패턴 정의 → (2) re.compile로 캐시 → (3) sub로 치환 → (4) subn으로 치환 건수 로깅 |
| 주의 | 저장 이전 단계에서 마스킹(로그/DB/파일에 원본 남기지 않기) |
PII 마스킹 예시 표 (re 사용 — 코드 + 출력)
| 유형 | 예시(re.sub로 바로 마스킹) | 결과 |
| 이메일 | import re s = '문의: abc.def@ex.com' # 이메일: 사용자명 첫 글자만 남기고 마스킹 s2 = re.sub(r'([A-Za-z0-9._%+-]+)@([\w.-]+\.[A-Za-z]{2,})', lambda m: m.group(1)[0] + '***@' + m.group(2), s) # r'' 문자열은 “백슬래시를 문자 그대로 유지”한다. 복잡한 문장을 단순화시켜줌 print(s2) |
문의: a***@ex.com |
| 휴대폰 / 일반전화 |
import re s = '010-1234-5678 / 02-123-4567' # 전화: 가운데·끝 숫자 마스킹 s2 = re.sub(r'\b(0\d{1,2})[-.\s]?(\d{3,4})[-.\s]?(\d{4})\b', lambda m: f"{m.group(1)}-{'*'*len(m.group(2))}-{'*'*len(m.group(3))}", s) print(s2) # f"{...}" 문자열 포매팅 (각 부분 연결) |
010-****-**** / 02-***-**** |
| 주민번호 | import re s = '주민번호: 900101-1234567' # RRN: 뒤 7자리 전부 마스킹 s2 = re.sub(r'\b(\d{6})-?(\d{7})\b', lambda m: m.group(1) + '-' + '*'*len(m.group(2)), s) print(s2) # -? = 하이픈이 있을 수도 있고 없을 수도 있다. |
주민번호: 900101-******* |
| 신용카드 | import re s = '카드: 1234-5678-9012-3456' # 카드: 마지막 8~12자(그룹3/4) 마스킹(예시) s2 = re.sub(r'\b(\d{4})[ -]?(\d{4})[ -]?(\d{4})[ -]?(\d{4})\b', lambda m: f"{m.group(1)}-{m.group(2)}-{'*'*len(m.group(3))}-{'*'*len(m.group(4))}", s) print(s2) |
카드: 1234-5678-****-**** |
| IPv4 주소 |
import re s = '접속 IP: 192.168.0.24' # IPv4: 마지막 옥텟 마스킹 s2 = re.sub(r'\b((?:\d{1,3}\.){3})(\d{1,3})\b', lambda m: m.group(1) + 'xxx', s) print(s2) |
접속 IP: 192.168.0.xxx |
+ 추가 설명



운영 팁 (실전 유용)
기능 역할 예시 결과
| 기능 | 역할 | 예시 | 결과 |
| re.subn() | 바꾼 횟수도 같이 반환 | pattern.subn(func, text) | new_text(치환된 새 문자열), count(치환 횟수) |
| re.compile() | 패턴을 재사용 | 한 번 컴파일해 여러 줄/여러 파일에 재사용 |
속도/가독성 ↑ |
| re.MULTILINE | 여러 줄 로그에서 줄 단위 매칭 |
pattern = re.compile(r'^ERROR: (.*)$', re.MULTILINE) | 각 줄의 시작 ^, 끝 $ 을 라인 단위로 인식 |
| re.IGNORECASE | 대소문자 구분 없음 | re.compile(r'python', re.IGNORECASE) | Python / PYTHON / PyThOn 전부 탐지 |
| re.sub() | 마스킹 단계 조절 | ①운영은 원복 불가 수준으로 최대한 감춤 ②개발은 문제 분석용으로 최소한의 힌트 제공 |
① ***@*** ② a***@ex.com |
| hashlib 조합 | 완전 불가역 처리 (복구불가) |
hashlib.sha256() | 마스킹이 아닌 암호학적 해싱 → 원본 복구 불가 |
라이브러리 예제 문제: "홍길동의 주민번호는 800905-1049118 입니다. 그리고 고길동의 주민번호는 700905-1059119 입니다.
그렇다면 누가 형님일까요? "라는 텍스트 중 주민 등록 번호 뒷자리는 모두 * 문자로 마스킹하려고 한다.

맥북에서 자동으로 따옴표가 변경되어 메모장에 입력한 코드를 파이썬 셸에 붙여넣으니 에러가 났다.
알고 보니 맥북은 자동 서식 기능이 켜져 있었다. 자동 변환을 원하지 않는다면 다음과 같이 설정을 변경하면 된다.
사과 > 시스템 설정 > 텍스트 > 텍스트 입력 > 편집 버튼 선택> 스마트 인용 부호 및 대시 사용 끄기 및 완료 선택


아, 오늘도 유익했다.
뭔가 해낸 느낌이다.
'미래 먹거리를 위하여' 카테고리의 다른 글
| [파이썬 정복하기] 라이브러리 3장 - 다양한 데이터 다루기1 (맥OS 기준) (2) | 2025.11.03 |
|---|---|
| [파이썬 정복하기] 라이브러리 2장 - 바이너리 데이터 다루기(맥OS 기준) (1) | 2025.11.02 |
| [파이썬 정복하기] 점프 투 파이썬 8장 – 정규표현식 (책 없이 시작하기) (0) | 2025.10.31 |
| [파이썬 정복하기] 점프 투 파이썬 7장 – 파이썬 날아오르기 (책 없이 시작하기) (0) | 2025.10.30 |
| [파이썬 정복하기] 점프 투 파이썬 6장 – 파이썬 프로그래밍, 어떻게 시작해야 할까? (책 없이 시작하기) (1) | 2025.10.29 |
