TOC
참고 강의
SWEA 파이썬 프로그래밍 기초(2) 파이썬의 기본 응용 #36
문자열 함수
문자열 출현 횟수 확인 : count() 함수
data_str = "Have a nice day!"
print("'{0}'".format(data_str))
input_str = input("위에서 찾고자하는 문자열을 입력하세요: ")
print(
"'{0}'에서 '{1}'은(는) {2}번 나타납니다.".format(
data_str, input_str, data_str.count(input_str)
)
)
문자열 찾기
find() / rfind() 함수
- 객체를 처음 찾은 인덱스를 반환
- 객체를 찾지 못하면 -1 반환
- find() 함수는 왼쪽에서 오른쪽 방향(처음에서 끝)으로 탐색
- rfind() 함수는 오른쪽에서 왼쪽 방향(끝에서 처음)으로 탐색
- find(찾을 문자열, 시작 인덱스)
index() 함수
- 객체를 처음 찾은 인덱스를 반환
- 문자열을 못 찾을 경우 Value Error 발생 -> try ~ except문 활용해서 예외 처리
data_str = "파이썬은 클래스를 이용해 객체를 생성하는 객체지향 프로그래밍 언어입니다."
print("'{0}'".format(data_str))
input_str = input("위에서 찾고자하는 문자열을 입력하세요: ")
# 1. find() 함수
print("str.find() ...")
idx = data_str.find(input_str)
if idx != -1: # 문자열을 못 찾았을 때 -1 반환
print("\t'{0}' : [{1}] <= 문자열을 가장 먼저 찾은 위치".format(input_str, idx))
else:
print("\t'{0}'를 찾을 수 없습니다.".format(input_str))
# 2. rfind() 함수
print("str.rfind() ...")
idx = data_str.rfind(input_str)
if idx != -1: # 문자열을 못 찾았을 때 -1 반환
print("\t'{0}' : [{1}] <= 문자열을 가장 마지막으로 찾은 위치".format(input_str, idx))
else:
print("\t'{0}'를 찾을 수 없습니다.".format(input_str))
# 3. index() 함수
print("str.index() ...")
try:
idx = data_str.index(input_str)
print("\t'{0}' : [{1}] <= 문자열을 가장 먼저 찾은 위치".format(input_str, idx))
except ValueError:
print("\t'{0}'를 찾을 수 없습니다.".format(input_str))
#4. 결과
[결과]
'파이썬은 클래스를 이용해 객체를 생성하는 객체지향 프로그래밍 언어입니다.'
위에서 찾고자하는 문자열을 입력하세요: 객체
str.find() ...
'객체' : [14] <= 문자열을 가장 먼저 찾은 위치
str.rfind() ...
'객체' : [23] <= 문자열을 가장 마지막으로 찾은 위치
str.index() ...
'객체' : [14] <= 문자열을 가장 먼저 찾은 위치
문자열의 삽입 : join() 함수
[삽입하고자 하는 문자열].join(대상이 되는 문자열)
data_str = "가나다라마바사아자차카타파하"
comma_space = ", "
output = comma_space.join(data_str)
print("{0}: {1}".format(type(output), output))
[결과]
<class 'str'>: 가, 나, 다, 라, 마, 바, 사, 아, 자, 차, 카, 타, 파, 하
대소문자 바꾸기
- capitalize() 함수 : 문자열의 첫 문자만 대문자 변환
- upper() 함수 : 문자열의 모든 문자 대문자 변환
- lower() 함수 : 문자열의 모든 문자 소문자 변환
data_str = "better tomorrow"
# 1. capitalize() 함수
data_str = data_str.capitalize()
print("'{0}'".format(data_str))
# [결과] 'Better tomorrow'
# 2. lower() 함수
data_str = data_str.lower()
print("'{0}'".format(data_str))
# [결과] 'better tomorrow'
# 3. upper() 함수
data_str = data_str.upper()
print("'{0}'".format(data_str))
# [결과] 'BETTER TOMORROW'
공백 제거 : strip() 함수
lstrip() 함수
문자열의 왼쪽부터 원하는 문자열을 제거
data_str = " 홍 길동 "
print("'{0}' : ({1})".format(data_str, len(data_str)))
# [결과] ' 홍 길동 ' : (11)
data_str = data_str.lstrip(" ")
print("'{0}' : ({1})".format(data_str, len(data_str)))
# [결과] '홍 길동 ' : (8)
rstrip() 함수
문자열의 오른쪽부터 원하는 문자열을 제거. 여러 문자를 제거할 수도 있음.
data_str = "___홍 길동_____ "
print("'{0}' : ({1})".format(data_str, len(data_str)))
# [결과] '___홍 길동_____ ' : (16)
data_str = data_str.rstrip("_ ") # "_"와 " " 모두 제거
print("'{0}' : ({1})".format(data_str, len(data_str)))
# [결과] '___홍 길동' : (8)
strip() 함수
인자로 전달된 문자열을 문자열의 왼쪽과 오른쪽에서 제거
data_str = " 0?홍 길동 _#"
print("'{0}' : ({1})".format(data_str, len(data_str)))
# [결과] ' 0?홍 길동 _#' : (11)
data_str = data_str.strip(" 0?_#")
print("'{0}' : ({1})".format(data_str, len(data_str)))
# [결과] '홍 길동' : (5)
문자열 교체 : replace() 함수
- replace() 함수 : 찾을 문자열과 교체 문자열을 인자로 사용해 교체
- 대상 문자열.replace(찾을 문자열, 교체 문자열, (반복 횟수))
data_str = "10....20....30....40....50"
data_str = data_str.replace("." * 4, "\t")
print("{0}".format(data_str))
# [결과] 10 20 30 40 50
문자열 자르기 : split() 함수
- 전달된 인자로 문자열을 잘라 이를 항목으로 갖는
리스트
생성 - 대상 문자열.split(자르는 기준문자)
data_str = "10, 20, 30, 40, 50"
data_str = data_str.replace(" ", "")
print(data_str)
# [결과] 10,20,30,40,50
data_list = data_str.split(",")
for val in data_list:
print(val)
[결과]
10
20
30
40
50
문자열 구성 확인 : is-() 함수
ex. isdigit() 함수 : digit(숫자문자열)입니까? 를 물어보는 함수
data_str = "10, 20, 3o, 40, 50"
data_str = data_str.replace(" ", "")
print(data_str)
data_list = data_str.split(",")
for val in data_list:
print(val, end=" ")
if not val.isdigit(): # 숫자문자열(digit)이 아니면
print("<=", end="") # 해당 문자열 옆에 <= 입력
print()
[결과]
10,20,3o,40,50
10
20
3o <=
40
50
실습
문제
문자열을 마스크 문자열로 치환하기
[결과]
'파이썬은 클래스를 이용해 객체를 생성하는 객체지향 프로그래밍 언어입니다.'
마스킹할 문자열을 입력하세요: $$$$$$
찾을 문자열을 입력하세요: 객체
[14] ~ [15]
파이썬은 클래스를 이용해 $$$$$$를 생성하는 객체지향 프로그래밍 언어입니다.
[23] ~ [24]
파이썬은 클래스를 이용해 $$$$$$를 생성하는 $$$$$$지향 프로그래밍 언어입니다.
나의 Sol
# -*- coding: utf-8 -*-
# masking.py
text = "파이썬은 클래스를 이용해 객체를 생성하는 객체지향 프로그래밍 언어입니다."
print("'{0}'".format(text))
mask = input("마스킹할 문자열을 입력하세요: ")
target = input("찾을 문자열을 입력하세요: ")
# find() 함수
t1 = text.find(target)
print("[{0}] ~ [{1}]".format(t1, t1 + len(target) - 1))
text2 = print("{0}{1}{2}".format(text[:t1], mask, text[t1 + len(target) :]))
print(text2)
# rfind() 함수
t2 = text.rfind(target)
print("[{0}] ~ [{1}]".format(t2, t2 + len(target) - 1))
text3 = text.replace(target, mask)
print(text3)
[결과]
'파이썬은 클래스를 이용해 객체를 생성하는 객체지향 프로그래밍 언어입니다.'
마스킹할 문자열을 입력하세요: $$$$$$
찾을 문자열을 입력하세요: 객체
[14] ~ [15]
파이썬은 클래스를 이용해 $$$$$$를 생성하는 객체지향 프로그래밍 언어입니다.
None
[23] ~ [24]
파이썬은 클래스를 이용해 $$$$$$를 생성하는 $$$$$$지향 프로그래밍 언어입니다.
replace() 함수를 쓰게 되면 해당 검색 문자열을 가지는 부분이 모두 바뀌는데, 문제에서는 하나하나 바뀌길 바라고 있어서 처음부터 replace() 함수를 쓸 수 없었다. 때문에 '객체'를 기준으로 앞뒤의 문자열, 그리고 mask인 '$$$$$$'을 이어붙여 출력하는 방식으로 하드코딩했다. '객체'가 3개 이상 생긴다면 무의미한 로직.
그리고 출력 중에 'None'이 뜨는데 이유를 찾을 수 없다.
모범 답안
replace(찾을 문자열, 바꾸는 문자열, (반복 횟수))로 replace 함수는 실행 횟수를 조절할 수 있었다.
# -*- coding: utf-8 -*-
# masking.py
data_str = "파이썬은 클래스를 이용해 객체를 생성하는 객체지향 프로그래밍 언어입니다."
print("'{0}'".format(data_str))
mask_str = input("마스킹할 문자열을 입력하세요: ")
find_str = input("찾을 문자열을 입력하세요: ")
idx = -1
count = 1
while True:
idx = data_str.find(find_str, idx + 1)
if idx != -1:
print("[{0}] ~ [{1}]".format(idx, idx + len(find_str) - 1))
new_str = data_str.replace(find_str, mask_str, count)
print(new_str)
count += 1
else:
break
왜 SWEA는 함수의 풀 내용을 알려주지 않는걸까 싶었다. 잘 구현도 못하고 고생만 했다ㅠㅠ 다른 문제에서 잘 활용해보겠다.