2012-01-31 28 views
23

Tôi có một vấn đề đơn giản, nhưng không thể đi kèm với một giải pháp đơn giản :)Phát hiện lặp lại trong chuỗi

Giả sử tôi có một chuỗi. Tôi muốn phát hiện nếu có một sự lặp lại trong đó.

tôi muốn:

"blablabla" # => (bla, 3) 

"rablabla" # => (bla, 2) 

Vấn đề là tôi không biết những gì mô hình tôi đang tìm kiếm (Tôi không có "bla" như đầu vào).

Bất kỳ ý tưởng nào?

EDIT:
Thấy các ý kiến, tôi nghĩ rằng tôi nên chính xác hơn một chút những gì tôi có trong tâm trí:

  • Trong một chuỗi, thì hoặc là một mô hình được repeted hay không.
  • Mẫu được lặp lại có thể có độ dài bất kỳ.

Nếu có mẫu, nó sẽ được lặp đi lặp lại cho đến khi kết thúc. Nhưng chuỗi có thể kết thúc ở giữa mẫu.

Ví dụ:

"testblblblblb" # => ("bl",4) 
+3

Không âm thanh như một vấn đề rất đơn giản với tôi – Hubro

+14

Tôi muốn nói 'rablabla' nên trả về '(' abl ', 2)', phải không? –

+0

theo ví dụ của bạn, chuỗi lặp lại có độ dài 3. Vì vậy, bạn đang tìm kiếm các chuỗi chỉ có chiều dài 3? – Jayy

Trả lời

39
import re 
def repetitions(s): 
    r = re.compile(r"(.+?)\1+") 
    for match in r.finditer(s): 
     yield (match.group(1), len(match.group(0))/len(match.group(1))) 

tìm tất cả không chồng chéo lặp lại trận đấu, sử dụng đơn vị ngắn nhất có thể lặp lại:

>>> list(repetitions("blablabla")) 
[('bla', 3)] 
>>> list(repetitions("rablabla")) 
[('abl', 2)] 
>>> list(repetitions("aaaaa")) 
[('a', 5)] 
>>> list(repetitions("aaaaablablabla")) 
[('a', 5), ('bla', 3)] 
+1

yay regex! –

+0

o_O. Tôi chắc chắn nên nhìn vào đó! – jlengrand

+0

Tôi sẽ đề xuất xây dựng một biểu đồ, nhưng tôi đoán điều này có cùng hiệu quả hơn;) – Marcin

Các vấn đề liên quan