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