2

親文字列内でサブ文字列が出現する場所を一覧表示するプログラムを作成しようとしています。たとえば、親文字列「abcabcabcabcabcabca」内で「bc」を検索すると、プログラムは1、4、7、10、13、16を返します。

これまで私は以下と協力してきました:

import string

def subStringMatchExact():
    print "This program will index the locations a given sequence"
    print "occurs within a larger sequence"
    seq = raw_input("Please input a sequence to search within: ")
    sub = raw_input("Please input a sequence to search for: ")
    n = 0
    for i in seq:
        x = string.find(seq, sub [n:])
        print x
        n = x + 1

また、string.findをstring.index演算子に置き換えてみました。何かアドバイスをいただければ幸いです。

4

3 に答える 3

3

.find()入力文字列自体でを呼び出すだけです。-1一致する場所、または一致するものが見つからなかった場合は場所を返します。また、開始パラメーターを受け取るため、次の一致を探すことができます。

def subStringMatchExact():
    print "This program will index the locations a given sequence"
    print "occurs within a larger sequence"
    seq = raw_input("Please input a sequence to search within: ")
    sub = raw_input("Please input a sequence to search for: ")

    positions = []
    pos = -1
    while True:
        pos = seq.find(sub, pos + 1)  # start searching *beyond* the previous match
        if pos == -1:   # Not found
            break
        positions.append(pos)
    return positions
于 2013-02-24T21:32:44.340 に答える
3

私は怠惰なので、使用しますre.finditer

>>> import re
>>> s = "abcabcabcabcabcabca"
>>> for m in re.finditer('bc',s):
...     print m.start()
... 
1
4
7
10
13
16
于 2013-02-24T21:33:29.950 に答える
0

リスト内包表記は、それがあなたにとって重要である場合、非常にエレガントな方法です。

>>> seq = "abcabcabcabcabcabca"
>>> sub = "bc"
>>> [i for i in range(len(seq)) if seq[i:].startswith(sub)]
[1, 4, 7, 10, 13, 16]

これも最速の解決策になるはずです。文字列を繰り返し処理し、残りの文字列(その位置から最後まで)が指定されたサブ文字列で始まるかどうかを確認しようとします。存在する場合はその位置を収集し、そうでない場合は次の位置に進みます。

于 2013-02-24T21:36:03.247 に答える