Python:在字符串中查找子字符串并返回子字符串的索引

时间:2014-02-18 01:52:51

标签: python string indexing substring

我有:

  • 功能: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"))

不确定是什么问题!

7 个答案:

答案 0 :(得分:170)

对于字符串对象,有一个内置方法可以在你知道的python中执行此操作吗?

s = "Happy Birthday"
s2 = "py"

print s.find(s2)

Python是一种“电池包含语言”,编写的代码可以完成你想要的大部分(无论你想要什么)..除非这是作业:)

编辑:find如果找不到字符串,则返回-1。

答案 1 :(得分:11)

理想情况下,你会像痴呆刺猬一样使用str.findstr.index 。但是你说你不能......

您的问题是您的代码仅搜索搜索字符串的第一个字符(第一个字符)位于索引2处。

你基本上是说char[0]s中,增加index,直到ch == char[0]在我测试时返回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

答案 2 :(得分:1)

派对迟到了,正在搜索同样的内容,因为“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()。

答案 3 :(得分:0)

没有直接回答这个问题,但我最近遇到了一个类似的问题,我被要求计算一个字符串在给定字符串中重复的次数。这是我写的函数:

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编程非常“陌生”。

答案 4 :(得分:0)

使用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()以来,我发现它的速度要快得多,因此我认为值得一提

答案 5 :(得分:0)

regular expression中还有另一种选择,即search方法

import re

string = 'Happy Birthday'
pattern = 'py'
print(re.search(pattern, string).span()) ## this prints starting and end indices
print(re.search(pattern, string).span()[0]) ## this does what you wanted

顺便说一句,如果您想查找所有出现的模式,而不仅仅是第一个,可以使用finditer方法

import re

string = 'i think that that that that student wrote there is not that right'
pattern = 'that'

print [match.start() for match in re.finditer(pattern, string)]

这将打印比赛的所有开始位置。

答案 6 :(得分:0)

这是一种简单的方法:

my_string = 'abcdefg'
print(text.find('def'))

输出:

3

如果子字符串不存在,您将得到 -1 。 例如:

my_string = 'abcdefg'
print(text.find('xyz'))

输出:

-1

有时候,如果子字符串不存在,您可能想抛出异常:

my_string = 'abcdefg'
print(text.index('xyz')) # It returns an index only if it's present

输出:

回溯(最近通话最近):

文件“ test.py”,第6行,位于 打印(text.index('xyz'))

ValueError:找不到子字符串