Python:在字符串中查找子字符串并返回该子字符串的索引
我有:
功能:"py"
和一个字符串:"py",
我本质上想输入"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"))
不知道怎么了!
5个解决方案
176 votes
在字符串对象上有一个内置方法可以在python中做到这一点,您知道吗?
s = "Happy Birthday"
s2 = "py"
print s.find(s2)
Python是一种“电池包含的语言”,其中编写的代码可以完成大多数您想要的(无论您想要什么)..除非这是家庭作业:)
编辑:find如果找不到字符串,则返回-1。
demented hedgehog answered 2020-01-16T19:01:30Z
14 votes
理想情况下,您会像痴呆的刺猬说的那样使用str.find或str.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
Eric Fortin answered 2020-01-16T19:01:01Z
1 votes
晚到聚会,正在搜索相同的内容,因为“中”无效,我刚刚创建了以下内容。
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()。
Parth answered 2020-01-16T19:01:59Z
1 votes
在使用find()的@demented刺猬上添加答案
在效率方面
在调用find()之前,可能值得首先检查s1是否在s2中。
如果您知道大多数情况下s1不会是s2的子字符串,这可能会更有效率
由于find()操作员非常高效
s1 in s2
转换效率更高:
index = s2.find(s1)
至
index = -1
if s1 in s2:
index = s2.find(s1)
当find()将返回-1时,这很有用。
我发现它的速度要快得多,因为在我的算法中多次调用find(),所以我认为值得一提
Jerry answered 2020-01-16T19:02:55Z
0 votes
没有直接回答问题,但是最近我遇到了一个类似的问题,我被问到要计算给定字符串中子字符串重复的次数。 这是我写的函数:
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编程的“新手”。
Anshul answered 2020-01-16T19:03:24Z