2017-10-31 3 views
0

Ich habe eine Zeichenfolge:Finden Muster in Python-String mit flexibler Länge jedes Musterkomponente

str_x = "121001221122010120211122211122222222112222" 

Ich möchte herausfinden, wie oft ein bestimmtes Muster im String beobachtet wird, sollte aber das Muster zu sehen als flexible:

Das Muster, die ich suche ist also:

  • mindestens drei 2 Jahren folgten von mindestens zwei 1'en gefolgt von mindestens drei 2er

Ein Muster der diese Bedingung erfüllt wird also beispielsweise „22211222“, sondern auch „2222111222“ und „222222221111111111222“

Ich möchte um herauszufinden, wie oft dieses "flexible Muster" in str_x gesehen wird.

Die richtige Antwort hier ist 2 mal.

Irgendwelche Ideen, wie man das macht? Vielen Dank.

EDIT

Angesichts der Definition, die ich oben platziert, ist die Antwort von 2 mal ist eigentlich falsch, da gültige Muster überlappen ... z "222111222", "2221112222", "22211122222" usw. sind alle Muster, die das Ziel erfüllen.

Was ich will, ist die Anzahl der Muster zu finden, die sich nicht überlappen (dh, noch 2 mal)

+0

Sie sollten regexp – Arseniy

Antwort

1

Sie haben Regex zu verwenden, um Ihr Problem zu lösen: https://docs.python.org/2/library/re.html

Der reguläre Ausdruck:
regex = r"2{3,}?1{2,}?2{3,}?"
Mittel = von mindestens zwei 1en

von mindestens drei 2 Jahren folgten gefolgt von mindestens drei 2 finden

Notation 2{3,} Mittel finden, zumindest th ree 2 des
? Mittel - gierige Suche - die Suche, die
überlappen Wenn Sie Muster finden möchten, die sich nicht überschneiden - das Entfernen nur ?

import re 

regex = r"2{3,}?1{2,}?2{3,}?" 

test_str = "121001221122010120211122211122222222112222" 

matches = re.finditer(regex, test_str) 

for matchNum, match in enumerate(matches): 
    matchNum = matchNum + 1 

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group())) 
print ("total matches: {matches}".format(matches= matchNum)) 
+0

verwenden Danke! Das hat geholfen. – Emjora

1

Hier ist ein Stück Code funktioniert:

def count_pattern(str): 
     # one_count keeps count of contiguous 1s 
     # we check for the pattern at 2 just after a block of 1s 
     # count keeps track of pattern counts 
     count=0 
     one_count=0 
     for i in range(1,len(str)): 
      if str[i]=='1': 
       if str[i-1]=='1': 
        one_count=one_count+1 
       else: 
        one_count=1 
      elif (str[i]=='2')&(str[i-1]=='1')&(len(str)-i>2)& 
       (i>one_count+2)&(one_count>1)&(str[(i+1):(i+3)]=='22')& 
       (str[(i-one_count-3):(i-one_count)]=='222'): 
       count=count+1 
     return(count) 


     print("Number of times the pattern 
     occurs=",count_pattern('121001221122010120211122211122222222112222'))