ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algorithm] - 기본 문자열 처리
    Algorithm/Algorithm 2022. 4. 12. 16:05

    문자열 처리

    문자열 관련하여 반복되는 개념들이 자주 나와 정리하기 위하여 쓴 글입니다.

     

    1. 회문 ( palindrome )


    문자열에 대해서 거꾸로 봐도 동일한지 여부
    # 1. 회문(palindrome)
    temp = '가나다다나가'
    def palindrome ( data ) :
        if data == data[::-1] :
            return True
        return False
    
    print ( palindrome(temp) )
    
    print( temp[::-1]==temp )

     

    2. 정규 표현식


    정규 표현식을 이용한 문자열 컨트롤 ( re )
    • re.sub( '패턴' , '바꿀문자열' , '적용할 문자열' )
    • re.compile('패턴') = 문자열 내에서 패턴 찾을 때 사용
    • match  = 문자열의 처음부터 패턴이 일치하는지 확인 및 패턴이 일치하는 값만 출력
    • search = 패턴이 일치하는 첫번째 문자 출력
    • findall = 패턴이 일치하는 모든 문자열 출력
    # 2. 정규 표현식
    
    # re.sub( '패턴' , '바꿀문자열' , '적용할 문자열' )
    import re
    print ( re.sub( '[0-9]' , 'n' , '1a2b3c4d' ))
    > nanbncnd
    
    q = re.compile('a[0-9]+b')
    
    # match
    q.match( 'a1b ac' )
    <re.Match object; span=(0, 3), match='a1b'>
    
    # search
    q.search( 'abb a12b' )
    > <re.Match object; span=(4, 8), match='a12b'>
    
    # findall
    q.findall( 'a1b a2b a123c' )
    > ['a1b', 'a2b']

     

    3. 문자열 뒤집기


    1)Rerverse Function

    2)Slicing

    # 3. 문자열 뒤집기
    # 1) reverse
    def reverse_data ( data ) :
        str_data = list(data)
        str_data.reverse()
        return ''.join( str_data )
        
    # 2) slicing
    def slicing_data ( data ) :
        return ''.join ( list(data)[::-1] )
    
    temp = 'abcdef'
    print ( temp )
    print ( reverse_data(temp) )
    print ( slicing_data(temp) )

     

    4. 조건에 맞게 재정렬


    일반적으로 DB문자열 재처리 하는 문제에 경우 해당
    # 4. 조건에 맞게 재정렬
    temp = ['1 A' , '1 B' , '6 A' , '2 D' , '4 B']
    print ( temp )
    temp.sort(key = lambda x : x.split()[1] )
    print ( temp )
    
    temp = ['kimuksung 20220412 댓글123' , 'te209 20220311 댓글55' , ' xnasj2 20220318 댓글99' ]
    def db_solution( data ) :
        data.sort(key = lambda x : ( x.split()[1] , x.split()[0] ) )
        return data
    print ( temp )
    print ( db_solution( temp ))

     

    5. 문자열 내 가장 많이 나오는 단어


    동일한 갯수여도 전부다 출력할 수 있어야 한다.
    # 5. 문자열 내에서 가장 많이 나오는 단어
    # 동일 갯수라도 전부 출력
    import re
    from collections import Counter
    
    paragraph = "Bobs hit a ball, the hit BALL flew far after it was hit by Bobs ! Bobs"
    
    def many_repeat_data ( data ) :
        answer = []
        data = re.sub ( '[^\w]' , ' ' , data )
        data = Counter(data.split())
        max_value = data.most_common(1)[0][1]
        
        for index  , value in data.items() :
            if value != max_value :
                break
            answer.append(index)
        return answer
    
    print ( many_repeat_data ( paragraph ) )

     

    6. 문자열에서 가장 많이 나오는 패턴 찾기


    • 동일한 갯수이면 가장 긴 단어들로만 추출
    # 6. 하나의 단어에서 가장 많이 나오는 반복 패턴 찾기
    # 동일한 갯수면 전부 출력
    from collections import Counter 
    #word = 'abcabcdefabc'
    word = 'aBxdeydeabZ'
    def many_repeat_pattern ( data ) :
        data = data.lower()
        n = len(data)
        count_data = []
        answer = []
        for i in range( 1 , n+1 ) :
            for j in range ( n ) :
                if i+j > n :
                    continue
                count_data.append( data[j:j+i])
        
        count_data = Counter(count_data)
        count_data = sorted(count_data.items() , key=lambda x: (- x[1] , -len(x[0]) ))
        max_len_value , max_value = len(count_data[0][0] ), count_data[0][1] 
        for temp in count_data :
            index , value = temp
            if len(index) == max_len_value and value ==max_value :
                answer.append(index)
    
        return answer
    
    print ( many_repeat_pattern ( word ) )

     

    7. 단어의 대소문자 경우의 수 모두 출력


    # 7. 특정 단어의 대소문자 모든 경우의 수 출력
    temp = 'abc'
    from itertools import product
    def all_case_upper_lower(data) :
        temp = list ( product(*zip( data.upper() , data.lower() ) ) )
        return [''.join(i) for i in temp]
    
    print  ( all_case_upper_lower( temp ) )

     

    댓글

Designed by Tistory.