web-dev-qa-db-fra.com

Python: trouve une sous-chaîne dans une chaîne et renvoie l'index de la sous-chaîne

J'ai: 

  • une fonction: def find_str(s, char)

  • et une chaîne: "Happy Birthday",

Je veux essentiellement saisir "py" et renvoyer 3 mais je continue d’obtenir 2 pour le renvoyer. 

Code:  

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

Pas sûr de ce qui ne va pas!

45
Tyler

Idéalement, vous utiliseriez str.find ou str.index comme un hérisson dément dit. Mais vous avez dit que vous ne pouvez pas ...

Votre problème est que votre code ne recherche que le premier caractère de votre chaîne de recherche qui (le premier) est à l'index 2.

Vous dites fondamentalement que si char[0] est dans s, incrémentez index jusqu’à ch == char[0] qui a renvoyé 3 lorsque je l’ai testé, mais c’était toujours faux. Voici un moyen de le faire.

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

Il a produit la sortie suivante:

3
8
-1
9
Eric Fortin

Il existe une méthode intégrée sur les objets chaîne pour faire cela en python, vous savez?

s = "Happy Birthday"
s2 = "py"

print s.find(s2)

Python est un "langage inclus avec les piles". Il y a du code écrit pour faire la plupart de ce que vous voulez déjà (ce que vous voulez) ... à moins que ce ne soit un devoir :)

Edit: find renvoie -1 si la chaîne est introuvable.

163
demented hedgehog

tard à la fête, était à la recherche de même, comme "in" n'est pas valide, je venais de créer suite.

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

qui produit 

3
8
-1

supprime lower () dans le cas où la recherche ne serait pas sensible à la casse.

1
Parth

Je n'ai pas répondu directement à la question, mais j'ai récemment reçu une question similaire dans laquelle on m'a demandé de compter le nombre de répétitions d'une sous-chaîne dans une chaîne donnée. Voici la fonction que j'ai écrite:

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

La fonction find () ne renvoie probablement que l'index de la première occurrence. Le fait de stocker l’index au lieu de compter, peut nous donner l’ensemble distinct d’index que la sous-chaîne est répété dans la chaîne.

Disclaimer: Je suis «extrêmement» novice en programmation Python.

0
Anshul