2016-02-17 23 views
9

Tôi có ví dụ như chuỗi BANANA và muốn tìm tất cả các phần có thể bắt đầu bằng nguyên âm. Kết quả tôi cần trông như thế này:Tìm tất cả các chất nền có thể bắt đầu bằng các ký tự từ việc chụp nhóm

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

Tôi cố gắng này: re.findall(r"([AIEOU]+\w*)", "BANANA") nhưng nó chỉ thấy "ANANA" mà có vẻ là trận đấu dài nhất. Làm thế nào tôi có thể tìm thấy tất cả các chất nền có thể khác?

+7

Regex là * không * công cụ tốt nhất cho điều đó. – Maroun

+0

Đó là những gì tôi sợ ... Có thể một cái gì đó với itertools? – roOt

+0

đệ quy sẽ làm việc –

Trả lời

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

Đây là cách đơn giản để thực hiện. Chắc chắn có một cách dễ dàng hơn mặc dù.

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

Như đã đề cập trong các nhận xét, Regex sẽ không phải là cách phù hợp để thực hiện việc này.

Hãy thử


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

Một cách pythonic hơn này:

>>> 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 với câu trả lời được chấp nhận:

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'") 

kết quả:

1st: 6.08756995201 
2nd : 5.25555992126 
Các vấn đề liên quan