복붙노트

[PYTHON] regex를 사용하여 중복 문자를 제거 하시겠습니까?

PYTHON

regex를 사용하여 중복 문자를 제거 하시겠습니까?

정규식을 사용하여 문자열의 모든 중복 문자 (특정 문자)를 제거하려고한다고 가정 해 봅시다. 이것은 간단합니다 -

import re
re.sub("a*", "a", "aaaa") # gives 'a'

중복 된 모든 문자 (즉, a, z)를 해당 문자로 대체하려면 어떻게해야합니까? 어떻게해야합니까?

import re
re.sub('[a-z]*', <what_to_put_here>, 'aabb') # should give 'ab'
re.sub('[a-z]*', <what_to_put_here>, 'abbccddeeffgg') # should give 'abcdefg'

참고 :이 중복 제거 방법을 해시 테이블 또는 일부 O (n ^ 2) algo 더 나은 태클 수 알고 있지만 regexes 사용하여이 탐색 할 싶어요.

해결법

  1. ==============================

    1.

    >>> import re
    >>> re.sub(r'([a-z])\1+', r'\1', 'ffffffbbbbbbbqqq')
    'fbq'
    

    [a-z] 주변의 ()는 캡처 그룹을 지정하고 패턴 및 대체 둘 모두의 \ 1 (역 참조)은 첫 번째 캡처 그룹의 내용을 참조합니다.

    따라서 정규 표현식은 "문자를 찾은 다음 그 문자가 하나 이상 나오면"읽습니다. 그런 다음 전체 발견 된 부분이 발견 된 문자의 단일 발생으로 대체됩니다.

    귀하의 예제 코드는 실제로 버그가 있습니다 :

    >>> re.sub('a*', 'a', 'aaabbbccc')
    'abababacacaca'
    

    * 연산자가 "0 이상의"일치와 일치하기 때문에 실제로 + 연산자를 사용하는 대신 'a *'대신 정규 표현식에 'a +'를 사용하여 두 개의 비 문자 사이에 빈 문자열을 일치 시키려고합니다. "1 또는 그 이상".

  2. ==============================

    2.연속되지 않은 항목의 중복을 제거하는데도 관심이있는 경우 루프에서 항목을 래핑해야합니다 (예 : 이렇게

    연속되지 않은 항목의 중복을 제거하는데도 관심이있는 경우 루프에서 항목을 래핑해야합니다 (예 : 이렇게

     s="ababacbdefefbcdefde"
    
     while re.search(r'([a-z])(.*)\1', s):
         s= re.sub(r'([a-z])(.*)\1', r'\1\2', s)
    
     print s  # prints 'abcdef'
    
  3. from https://stackoverflow.com/questions/4574509/remove-duplicate-chars-using-regex by cc-by-sa and MIT license