2016-02-17 1 views
9

Ich habe zum Beispiel die Zeichenfolge BANANA und möchte alle möglichen Teilstrings beginnend mit einem Vokal finden. Das Ergebnis muss ich wie folgt aussieht:Finden Sie alle möglichen Teilstrings beginnend mit Zeichen aus der Erfassungsgruppe

"A", "A", "A", "AN", "AN", "ANA", "ANA", "ANAN", "ANANA" 

Ich versuchte dies: re.findall(r"([AIEOU]+\w*)", "BANANA") aber es findet nur "ANANA", die die längste Übereinstimmung zu sein scheint. Wie kann ich alle anderen möglichen Teilstrings finden?

+7

Regex ist * nicht * das beste Werkzeug dafür. – Maroun

+0

Das habe ich befürchtet ... Vielleicht etwas mit itertools? – roOt

+0

Rekursion würde funktionieren –

Antwort

13
s="BANANA" 
vowels = 'AIEOU' 
sorted(s[i:j] for i, x in enumerate(s) for j in range(i + 1, len(s) + 1) if x in vowels) 
6

Dies ist eine einfache Möglichkeit, dies zu tun. Natürlich gibt es einen einfacheren Weg.

def subs(txt, startswith): 
    for i in xrange(len(txt)): 
     for j in xrange(1, len(txt) - i + 1): 
      if txt[i].lower() in startswith.lower(): 
       yield txt[i:i + j] 

s = 'BANANA' 
vowels = 'AEIOU' 
print sorted(subs(s, vowels)) 
2

Wie bereits in den Kommentaren erwähnt, wäre Regex nicht der richtige Weg.

Versuchen Sie, diesen


def get_substr(string): 
    holder = [] 
    for ix, elem in enumerate(string): 
     if elem.lower() in "aeiou": 
      for r in range(len(string[ix:])): 
       holder.append(string[ix:ix+r+1]) 
    return holder 

print get_substr("BANANA") 
## ['A', 'AN', 'ANA', 'ANAN', 'ANANA', 'A', 'AN', 'ANA', 'A']
4

Ein mehr pythonic Weg:

>>> def grouper(s): 
...  return [s[i:i+j] for j in range(1,len(s)+1) for i in range(len(s)-j+1)] 
... 
>>> vowels = {'A', 'I', 'O', 'U', 'E', 'a', 'i', 'o', 'u', 'e'} 
>>> [t for t in grouper(s) if t[0] in vowels] 
['A', 'A', 'A', 'AN', 'AN', 'ANA', 'ANA', 'ANAN', 'ANANA'] 

Benchmark mit akzeptierter Antwort:

from timeit import timeit 

s1 = """ 
sorted(s[i:j] for i, x in enumerate(s) for j in range(i + 1, len(s) + 1) if x in vowels) 
""" 

s2 = """ 
def grouper(s): 
    return [s[i:i+j] for j in range(1,len(s)+1) for i in range(len(s)-j+1)] 
[t for t in grouper(s) if t[0] in vowels] 
    """ 

print '1st: ', timeit(stmt=s1, 
         number=1000000, 
         setup="vowels = 'AIEOU'; s = 'BANANA'") 
print '2nd : ', timeit(stmt=s2, 
         number=1000000, 
         setup="vowels = {'A', 'I', 'O', 'U', 'E', 'a', 'i', 'o', 'u', 'e'}; s = 'BANANA'") 

Ergebnis:

1st: 6.08756995201 
2nd : 5.25555992126 
Verwandte Themen