2017-02-17 41 views
1
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()) 

上面是代碼是對任務的響應。任務是:正則表達式代碼不能在python中工作

給出字符串S.

我需要找到開始和串k的結束的指數在S.

如果輸入的是:

aaadaa 
aa 

輸出應該是:

(0, 1) 
(1, 2) 
(4, 5) 

我知道我寫的代碼是錯誤的,因爲我沒有得到所需的輸出。我經過for循環後再次通過該行。我無法說服自己,這是錯誤的。我只想知道爲什麼for循環後的代碼不起作用? 有人能幫助我嗎?

+1

我不認爲你應該通過'我'''搜索'就像那樣。搜索的第三個參數是「flags」,而不是「索引開始搜索」,如果這就是你想要做的。 – Kevin

+0

你甚至不需要這個正則表達式(這是一個矯枉過正)。使用標準的'string.find()'。 – zwer

回答

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 

應該按照您的預期完成工作。


我查preexisted解決方案,他們不符合您的要求:

  • re.finditer只能做非重疊搜索。
  • re.findall重疊搜索,但未能檢索索引。
  • re.finditerre.findalllook ahead僅返回匹配的文本。

我想寫這個自己的功能是最好的方式來做到這一點。


不錯。

相關問題