[PYTHON] regex를 사용하여 중복 문자를 제거 하시겠습니까?
PYTHONregex를 사용하여 중복 문자를 제거 하시겠습니까?
정규식을 사용하여 문자열의 모든 중복 문자 (특정 문자)를 제거하려고한다고 가정 해 봅시다. 이것은 간단합니다 -
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.
>>> 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.연속되지 않은 항목의 중복을 제거하는데도 관심이있는 경우 루프에서 항목을 래핑해야합니다 (예 : 이렇게
연속되지 않은 항목의 중복을 제거하는데도 관심이있는 경우 루프에서 항목을 래핑해야합니다 (예 : 이렇게
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'
from https://stackoverflow.com/questions/4574509/remove-duplicate-chars-using-regex by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬 urllib / urllib2를 사용하여 파일을 업로드하는 http POST 요청을 작성하십시오. (0) | 2018.11.10 |
---|---|
[PYTHON] 파이썬에서 가장 빠른 pairwise distance metric (0) | 2018.11.10 |
[PYTHON] 목록에서 50 개의 항목을 무작위로 선택하여 파일에 쓰십시오. (0) | 2018.11.10 |
[PYTHON] 파이썬에서 목록을 순회하면서 요소를 제거하십시오 [duplicate] (0) | 2018.11.10 |
[PYTHON] 파이썬 로깅 모듈에서 줄 바꿈을 억제하십시오. (0) | 2018.11.09 |