import re
st=input() #The input string
ss=input() #The substring to be searched
lss=len(ss)
lst=len(st)
x=lst-lss
for i in range(x):
r=re.search(r'(%s)'%ss,st,i)
if r:
print(r.start(),r.end())
以上是代码是对任务的响应。任务是:
给出字符串S.
我需要在S中找到字符串k的开头和结尾的索引。
如果输入为:
aaadaa
aa
输出应为:
(0, 1)
(1, 2)
(4, 5)
我知道我写的代码是错误的,因为我没有得到所需的输出。我在循环后经过并再次通过该行。我无法说服自己这是错的。我只是想知道为什么for循环后的代码不起作用? 有人可以帮助我吗?
答案 0 :(得分:0)
您应首先查看re.search()
的文档,其第三个参数为flag
。
在你的情况下,你正在寻找重叠结果,我意识到没有直接的解决方案,所以我写了一个递归
import re
string = input() # The input string
pattern = input() # The substring to be searched
def match(pattern, string, startIdx=0):
if startIdx <= len(string) - len(pattern):
res = re.search(pattern, string[startIdx:])
if res is not None:
print(res.start() + startIdx, res.end() + startIdx - 1)
return match(pattern, string, startIdx + res.start() + 1)
match(pattern, string)
,其输出为
0 1
1 2
4 5
应该按照您的预期完成工作。
我检查了预先存在的解决方案,但它们不符合您的要求:
re.finditer
只能执行非重叠搜索。re.findall
执行重叠搜索,但无法检索索引。re.finditer
和re.findall
与look ahead仅返回匹配的文字。我想编写这个自己的函数是最好的方法。
很好的问题,但是。