在字符串中查找子字符串及其切片?

1 投票
3 回答
1323 浏览
提问于 2025-04-16 16:34

我一直在帮我的朋友做作业,但我连从哪里开始都不知道。我能找到字符串中的子串,但要找出它的起始位置让我很困扰。我已经花了好几个小时了,任何帮助都很欢迎。下面是我关于这个作业的所有信息。

PS:他整个班级都不知道怎么做。老师给他们的作业难度太高了,超出了他们和我的能力范围。

写一个程序,让用户输入两个字符串 stringA 和 stringB。

  1. 程序首先要找到 stringA 中所有 stringB 出现的起始位置。

    比如,如果 stringA 是 "the car is in that carport",而 stringB 是 "car",那么程序应该报告 stringB 在 stringA 中出现在位置 4 和 19(记住,字符串是从位置 0 开始的)。

  2. 接下来,程序要找到 stringA 中 stringB “几乎”出现的所有起始位置。

    • 这里的“几乎”是指 stringB 中有一个字母不匹配。
    • 例如,如果 stringA 和上面一样,而 stringB 是 "the",那么程序应该报告 stringB 几乎出现在位置 14,也就是字符串 "tha" 的起始位置。
    • 注意,它不会报告在位置 0 几乎出现,因为在那里没有字母不匹配。
  3. 最后,程序要找到 stringA 中 stringB 的反向字符串出现的所有起始位置。

    • 例如,如果 stringA 和上面一样,而 stringB 是 "rop",那么程序应该报告 stringB 的反向字符串在 stringA 中出现在位置 22。

程序 equalsubstrings.py 对理解如何编写这个程序很有帮助。

3 个回答

0

我给你两个提示:

要检查一个字符串是否是另一个字符串的子串,你可以这样做:

  1. 使用 find 方法:

a="this is a test"

b="test"

a.find(b,0,14)

结果是 10

  1. 使用 in 操作符,像下面这个例子:

a="this is a test"
b="test"
c="not related text"
b in a
True
b in c
False

要反转一个字符串,可以这样做:

>>> a="this is a test"
>>> a[::-1]
'tset a si siht'

祝你作业顺利!

0

我会使用re模块。

  • re.finditer可以让你遍历一个字符串中所有子字符串的匹配项。
  • 每次匹配都会给你一个“匹配对象”。
  • 你可以在任何匹配对象上使用mo.start()来找到这个匹配在字符串中的位置索引。
  • 对于那些“差不多”的匹配,可以逐个字符地检查字符串B,把当前字符替换成[^<current_character>],然后对每个生成的正则表达式重复匹配过程,记录下所有的匹配。
  • 最后,使用字符串B的反向进行简单搜索(具体方法可以参考其他地方)。

这种方法的好处是:你能很好地掌握re模块的用法 :-) 。

顺便问一下:那个神秘的equalsubstrings.py程序是什么?;-)

1
stringA = "the car is in that carport"
stringB = "the"

exact = []
reverse = []
almost = []

lenA = len(stringA)
lenB = len(stringB)
limit = lenA - lenB
reversedB = stringB[::-1]

pos = stringA.find(stringB)
while pos >= 0:
    exact.append(pos)
    pos = stringA.find(stringB, pos + 1)

pos = stringA.find(reversedB)
while pos >= 0:
    exact.append(pos)
    pos = stringA.find(reversedB, pos + 1)

for i in range(limit):
    substrA = stringA[i:i+lenB]
    misses = 0
    for j in range(lenB):
        if substrA[j] != stringB[j]:
            misses += 1
    if misses == 1:
        almost.append(i)

print exact, almost, reverse

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答