web-dev-qa-db-ja.com

Python:文字列内の部分文字列を検索し、部分文字列のインデックスを返します

私は持っています:

  • 関数:def find_str(s, char)

  • および文字列:"Happy Birthday"

基本的に"py"を入力して3を返したいのですが、代わりに2を取得し続けます。

コード:

def find_str(s, char):
    index = 0           
    if char in s:
        char = char[0]
        for ch in s:
            if ch in s:
                index += 1
            if ch == char:
                return index

    else:
        return -1

print(find_str("Happy birthday", "py"))

何が悪いのかわかりません!

50
Tyler

理想的には、 str.find または str.indexを使用します。しかし、あなたはできないと言いました...

問題は、コードが検索文字列の最初の文字(最初の文字)のみをインデックス2に検索することです。

基本的に、char[0]sにある場合、ch == char[0]が3を返すまでindexを増やしますが、テストしたときに3が返されましたが、まだ間違っていました。これを行う方法を次に示します。

def find_str(s, char):
    index = 0

    if char in s:
        c = char[0]
        for ch in s:
            if ch == c:
                if s[index:index+len(char)] == char:
                    return index

            index += 1

    return -1

print(find_str("Happy birthday", "py"))
print(find_str("Happy birthday", "rth"))
print(find_str("Happy birthday", "rh"))

次の出力が生成されました。

3
8
-1
12
Eric Fortin

pythonでこれを行う文字列オブジェクトの組み込みメソッドがありますか?

s = "Happy Birthday"
s2 = "py"

print s.find(s2)

Pythonは「バッテリーを含む言語」であり、既に望んでいることの大部分を実行するために記述されたコードがあります(これが宿題でない限り)。

編集:文字列が見つからない場合、findは-1を返します。

174

find()の使用に関する@dementedハリネズミの答えに追加

効率に関して

find()を呼び出す前に、s1がs2にあるかどうかを最初に確認する価値があります。
ほとんどの場合、s1はs2の部分文字列ではないことがわかっている場合、これはより効率的です。

in演算子は非常に効率的であるため

 s1 in s2

変換する方が効率的です:

index = s2.find(s1)

index = -1
if s1 in s2:
   index = s2.find(s1)

これは、find()が-1を多く返す場合に役立ちます。

find()が私のアルゴリズムで何度も呼び出されていたので、かなり速くなったので、言及する価値があると思いました

1
Jerry

「in」は無効なので、パーティーに遅れて、同じものを探していました。次のように作成しました。

def find_str(full, sub):
    index = 0
    sub_index = 0
    position = -1
    for ch_i,ch_f in enumerate(full) :
        if ch_f.lower() != sub[sub_index].lower():
            position = -1
            sub_index = 0
        if ch_f.lower() == sub[sub_index].lower():
            if sub_index == 0 :
                position = ch_i

            if (len(sub) - 1) <= sub_index :
                break
            else:
                sub_index += 1

    return position

print(find_str("Happy birthday", "py"))
print(find_str("Happy birthday", "rth"))
print(find_str("Happy birthday", "rh"))

生産する

3
8
-1

大文字と小文字を区別しない検索が必要ない場合は、lower()を削除します。

1
Parth

質問に直接答えていませんが、最近、特定の文字列で部分文字列が繰り返される回数を数えるように求められた同様の質問がありました。これが私が書いた関数です。

def count_substring(string, sub_string):
    cnt = 0
    len_ss = len(sub_string)
    for i in range(len(string) - len_ss + 1):
        if string[i:i+len_ss] == sub_string:
            cnt += 1
    return cnt

Find()関数は、おそらく最初の発生のインデックスのみを返します。単にカウントする代わりにインデックスを保存すると、サブストリングがストリング内で繰り返されるインデックスの明確なセットを得ることができます。

免責事項:私はPythonプログラミングを初めて使用します。

0
Anshul