在字符串中查找子字符串及其切片?
我一直在帮我的朋友做作业,但我连从哪里开始都不知道。我能找到字符串中的子串,但要找出它的起始位置让我很困扰。我已经花了好几个小时了,任何帮助都很欢迎。下面是我关于这个作业的所有信息。
PS:他整个班级都不知道怎么做。老师给他们的作业难度太高了,超出了他们和我的能力范围。
写一个程序,让用户输入两个字符串 stringA 和 stringB。
程序首先要找到 stringA 中所有 stringB 出现的起始位置。
比如,如果 stringA 是 "
the car is in that carport
",而 stringB 是 "car
",那么程序应该报告 stringB 在 stringA 中出现在位置 4 和 19(记住,字符串是从位置 0 开始的)。接下来,程序要找到 stringA 中 stringB “几乎”出现的所有起始位置。
- 这里的“几乎”是指 stringB 中有一个字母不匹配。
- 例如,如果 stringA 和上面一样,而 stringB 是 "
the
",那么程序应该报告 stringB 几乎出现在位置 14,也就是字符串 "tha
" 的起始位置。 - 注意,它不会报告在位置 0 几乎出现,因为在那里没有字母不匹配。
最后,程序要找到 stringA 中 stringB 的反向字符串出现的所有起始位置。
- 例如,如果 stringA 和上面一样,而 stringB 是 "
rop
",那么程序应该报告 stringB 的反向字符串在 stringA 中出现在位置 22。
- 例如,如果 stringA 和上面一样,而 stringB 是 "
程序 equalsubstrings.py 对理解如何编写这个程序很有帮助。
3 个回答
0
我给你两个提示:
要检查一个字符串是否是另一个字符串的子串,你可以这样做:
- 使用 find 方法:
a="this is a test"
b="test"
a.find(b,0,14)
结果是 10
- 使用
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
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。