2013-07-17 1 views
0

중복 된 문자를 특정 숫자로 줄이는 방법이 있습니까 (예 :이 문자열이있는 경우).파이썬을 사용하여 문자열의 중복 문자를 줄이는 방법

"I liiiiked it, thaaaaaaank you"

예상 출력 : 4 이상 중복 문자, 예를 들어,이 그것을 적은 4 동등 이상 또는 다음 단어 네 개의 문자와 경우 감소 할 필요가있는 경우 "I liiiiked it thaaaank you"

그렇게해야이 머무는 같은.

+3

아직 해결할 코드를 작성해 보셨습니까? 그렇다면 질문에 맞게 수정해야합니다. – Marius

+0

도움을 주셔서 감사합니다. 코드를 올바르게 작성하지 않았습니다. 문자열을 단어로 분리 한 다음 각 단어를 문자 목록으로 분리 한 다음이 문자를 반복합니다. 하지만 매뉴얼과 아마도 아마 오랜 시간이 걸릴 것입니다, 특별히 그게 내 데이터가 정말 큽니다! ... 다른 방법들도 그렇게 쉽지? 또는 패턴? – user2490790

+0

루프 나 정규식 중 하나를 사용하여 수행 할 수 있습니다. 이게 네 숙제 야, 그렇지? 어쩌면 당신이 배우기를 원한다면 여기에 직접 일을해야 할 것입니다. –

답변

6
>>> import re 
>>> s="I liiiiked it, thaaaaaaank you" 
>>> re.sub(r"(.)(\1{3})(\1+)", r"\1\2", s) 
'I liiiiked it, thaaaank you' 

이 정규 표현식 3 개 그룹을 찾습니다.

첫 번째 문자는 임의의 문자입니다. 두 번째 문자는 동일한 문자의 3 ​​이상이며 세 번째 문자는 첫 번째 문자의 하나 이상입니다.

이들 3 개 그룹

은 단지 그룹 1과 여기에 2

는 더 간단한 방법을 인기로 치환

>>> re.sub(r"(.)\1{4,}", r"\1"*4, s) 
'I liiiiked it, thaaaank you' 

의 첫 글자 인 한 그룹 (.)가있다 이번에 시합. 동일한 편지가 4 번 이상 계속 입력되어야합니다. \1{4,}. 그래서 그것은 5 개 이상의 동일한 문자와 일치합니다. 교체는 그 편지를 4 번 반복 한 것입니다.

+0

와우! Thaaaank so so, 단 한 줄로 모든 것을 다룹니다! ... 매우 높이 평가되었습니다 .. – user2490790

+0

굉장 - 단 한 줄의 정규식이 있어야한다는 것을 알고있었습니다. 첫번째 정규 표현식처럼 2 번째 정규 표현식을 약간 설명해 주시겠습니까? –

1

하지 최적의 솔루션 - 내 정규식 ... 내가

import re 

def rep(o): 
    g = o.group(0) 
    if len(g) > 4: 
     return g[0:3] 
    return g 

foo = 'iiiiiiii liiiiiiikkkkkkkkkeeeee fooooooddd' 
foo1 = re.sub(r'(\w)\1+', rep, foo) 

# iiii liiiikkkkeeee fooooddd 

당신은 아마 당신이 그렇게 경사 경우이 땜질 시작할 수 있다고 생각 고정 될 필요가있다.

당신은 입력 문자열을 통해 단일 스캔하여이 작업을 수행 할 수 있습니다
+0

sooo 정말 고마워요!, 정말 좋은 ... – user2490790

2

, 단지 현재의 문자의 수를 유지하고 너무 많은 반복있어 경우 출력에 추가하지 않습니다

input_string = "I liiiiked it, thaaaaaaank you" 

max_reps = 4 
prev_char = None 
rep_count = 0 
output = "" 

for char in input_string: 
    if not char == prev_char: 
     rep_count = 1 
     prev_char = char 
     output += char 
    else: 
     if rep_count < max_reps: 
      rep_count += 1 
      output += char 
     else: 
      rep_count += 1 

을 문자열 연결을 피함으로써 가능하게 더 빠른 버전은 (this question 참조)

input_string = "I liiiiked it, thaaaaaaank you" 

max_reps = 4 
prev_char = None 
rep_count = 0 
output_list = [] 

for char in input_string: 
    if not char == prev_char: 
     rep_count = 1 
     prev_char = char 
     output_list.append(char) 
    else: 
     if rep_count < max_reps: 
      rep_count += 1 
      output_list.append(char) 
     else: 
      rep_count += 1 

output = ''.join(output_list) 
+0

고마워요, 제가 시도한 것과 거의 똑같은 문제가 있습니다.하지만이 방법은 정말 오랜 시간이 걸립니다. 여러분의 도움에 감사드립니다. – user2490790

+0

@ user2490790 : 속도는 파이썬이 문자열을 처리하는 방식과 관련이 있습니다. 제가 링크 한 질문에서 논의되었습니다. 새로운 목록 기반 버전을 사용해 볼 수도 있지만 실제로 더 빠를 것이라는 보장은 할 수 없습니다. – Marius