SWEA 파이썬 프로그래밍 기초(2) 파이썬의 기본 응용 #36


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)
    )
)

  • 객체를 처음 찾은 인덱스를 반환
  • 객체를 찾지 못하면 -1 반환
  • find() 함수는 왼쪽에서 오른쪽 방향(처음에서 끝)으로 탐색
  • rfind() 함수는 오른쪽에서 왼쪽 방향(끝에서 처음)으로 탐색
  • find(찾을 문자열, 시작 인덱스)

  • 객체를 처음 찾은 인덱스를 반환
  • 문자열을 못 찾을 경우 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(대상이 되는 문자열)

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'

문자열의 왼쪽부터 원하는 문자열을 제거

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)

문자열의 오른쪽부터 원하는 문자열을 제거. 여러 문자를 제거할 수도 있음.

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)

인자로 전달된 문자열을 문자열의 왼쪽과 오른쪽에서 제거

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(찾을 문자열, 교체 문자열, (반복 횟수))
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(자르는 기준문자)
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

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]
파이썬은 클래스를 이용해 $$$$$$를 생성하는 $$$$$$지향 프로그래밍 언어입니다.

# -*- 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는 함수의 풀 내용을 알려주지 않는걸까 싶었다. 잘 구현도 못하고 고생만 했다ㅠㅠ 다른 문제에서 잘 활용해보겠다.