在 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 循环和等价 (==) 找到子字符串吗?没有正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中从 For 循环中存储多个矩阵

避免在Python中嵌套for循环

在for循环中调用函数-python [关闭]

Django模板中的数字for循环

在 Python 中减少 for 循环是不可能的?

Partials vs for 循环——最佳实践