在 Python 中,您可以使用 for 循环和等价 (==) 找到子字符串吗?没有正则表达式
Posted
技术标签:
【中文标题】在 Python 中,您可以使用 for 循环和等价 (==) 找到子字符串吗?没有正则表达式【英文标题】:In Python, can you find a substring using a for loop and equivalence (==) ? No regex 【发布时间】:2014-01-16 14:43:33 【问题描述】:这是我的问题: 编写一个接受两行输入的程序,我们称第一个针和第二个干草堆。 打印针作为 haystack 的子串出现的次数。 鼓励我使用循环和等价运算符。
我没有取得太大进展 - 这是我 4 小时后的代码...
..两天后我得到了这个...
needle = 'sses'
haystack = 'assesses'
count = 0 # initialize the counter
index = haystack.index(needle) # get the first character in the substring
string1 = haystack[index:len(needle) + index] # get the whole substring
for position in range(0,len(haystack)): # loop through the string
if haystack[position:len(needle) + index] == string1: # match the 1st substring
count += 1 # iterate the counter
print (count)
...我的问题是,如何让 for 循环计算字符串的第二次出现?
谢谢
提姆
最后,“正确”答案:
needle = input()
haystack = input()
count = 0
if needle in haystack:
index = haystack.index(needle)
string1 = haystack[index:len(needle) + index]
for position in range(0,len(haystack)):
if haystack[position:len(needle) + position] == string1:
count += 1
print (count)
【问题讨论】:
请添加一个标签,指定这是哪种语言。如果你被“鼓励”在某个地方尝试循环,它在哪里?这可能是一个非常强烈的暗示...... 我不认为它被称为“等价”——这意味着别的东西。 【参考方案1】:让我们逐行分解您的代码:
needle = 'sses'
haystack = 'assesses'
count = 0 # initialize the counter
到目前为止还好,这只是初始化。
index = haystack.index(needle) # get the first character in the substring
这一行已经是一个问题,index
如果找不到子字符串,则会引发ValueError
。在这种情况下,您的程序会崩溃。您应该改用 haystack.find(needle)
,它的作用相同,但如果未找到子字符串,则不要引发 ValueError
,而是返回 -1
。
但是我完全不明白你为什么要使用这条线。您的以下循环将遍历整个haystack
,并且还将找到needle
的第一次出现。
string1 = haystack[index:len(needle) + index] # get the whole substring
仅当在上一行中找到 needle
时,此行才有效。还猜猜string1
在这行之后会是什么?您正在提取 haystack
的部分,您之前在其中找到了子字符串 needle
。所以结果将是string1 == needle
,这对您没有任何帮助。
for position in range(0,len(haystack)): # loop through the string
好的,你循环遍历字符串中的所有位置。
if haystack[position:len(needle) + index] == string1: # match the 1st substring
所以在这里我不明白你为什么要再次找到第一次出现,你之前已经找到了。你不想检查position
是否有匹配,无论是第一还是第二或第三……一个?所以我猜haystack[position:len(needle) + index]
应该提取haystack
的子字符串,它从位置position
开始,长度为needle
。但是为什么会有+ index
呢?第一次出现(保存在index
)与此有什么关系?你不是说+ position
吗?最后,您将与string1
进行比较,正如我所说(如果您的代码进入这一行)等于needle
。那么为什么不直接和needle
比较呢?
count += 1 # iterate the counter
这行代码在你发布的代码中有错误的缩进,它应该比 if 语句更深。
最后,您必须在 for 循环中考虑,如果 position
到达 haystack
的末尾,则可能不再有长度为 len(needle)
的子字符串从 position
开始。因此,您可能希望在此之前停止迭代。 (编辑:我只是注意到代码无论如何都会正确运行。没有必要在 python 中解决这个问题,因为允许使用超出字符串范围的索引,但它会在其他语言中。)
我想这是一个练习,但如果不是这样,在 python 中会有更简单的方法来做到这一点:count = haystack.count(needle)
。不过,您提出的算法有一点不同。 string.count(substring)
将返回非重叠匹配的数量,而您当前的代码将找到非重叠和重叠匹配的数量。您发布的练习不清楚两者中的哪一个。但是,如果您应该只找到不重叠的结果,您也需要在 for 循环中考虑这一点。
还可以对代码的样式和性能进行一些改进,但我不会深入讨论,因为您似乎根本无法让它工作。
【讨论】:
@Tim,请重新回答(在标有“您的回答”的框中),而不是编辑您原来的问题!以上是关于在 Python 中,您可以使用 for 循环和等价 (==) 找到子字符串吗?没有正则表达式的主要内容,如果未能解决你的问题,请参考以下文章