我有:
功能: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"))
不确定是什么问题!
答案 0 :(得分:170)
对于字符串对象,有一个内置方法可以在你知道的python中执行此操作吗?
s = "Happy Birthday"
s2 = "py"
print s.find(s2)
Python是一种“电池包含语言”,编写的代码可以完成你想要的大部分(无论你想要什么)..除非这是作业:)
编辑:find
如果找不到字符串,则返回-1。
答案 1 :(得分:11)
理想情况下,你会像痴呆刺猬一样使用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
答案 2 :(得分:1)
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:找不到子字符串