logo
Search검색어를 포함하는 게시물들이 최신순으로 표시됩니다.
    Table of Contents
    [Python] 문자열

    이미지 보기

    [Python] 문자열

    • 22.01.08 작성

    • 읽는 데 10

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

    profile

    FE Developer 박승훈

    노력하는 자는 즐기는 자를 이길 수 없다