如果子字符串替换了随机字符,如何找到子字符串?

EB2*_*127 4 python string algorithm substring

假设我们在 Python 中有一个字符串:

original_string = "TwasTheNightBeforeChristmasWhenAllThroughTheHouse"
Run Code Online (Sandbox Code Playgroud)

我们有兴趣找到子字符串的起始坐标substring ="ChristmasWhen"。这在 Python 中非常简单,即

>>> substring ="ChristmasWhen"
>>> original_string.find(substring)
18
Run Code Online (Sandbox Code Playgroud)

这检查出来

>>> "TwasTheNightBeforeChristmasWhenAllThroughTheHouse"[18]
'C'
Run Code Online (Sandbox Code Playgroud)

如果我们试图寻找一个不存在的字符串,find()将返回 -1。

这是我的问题:

我有一个子字符串,它保证来自原始字符串。但是,此子字符串中的字符已被随机替换为另一个字符。

如果子字符串具有'-'替换某些字母的随机字符,我如何通过算法找到子字符串的开始坐标(或至少检查是否可能)?

这是一个具体的例子:

original_string = "TwasTheNightBeforeChristmasWhenAllThroughTheHouse"
substring = '-hri-t-asW-en'
Run Code Online (Sandbox Code Playgroud)

自然,如果我尝试original_string.find('-hri-t-asW-en'),但有可能找到hri从 19 开始,因此使用前缀-,子字符串original_string.find('-hri-t-asW-en')必须是 18。

Jea*_*nès 5

这通常是正则表达式的用途:查找模式。然后你可以尝试:

import re                       # use regexp
original_string = "TwasTheNightBeforeChristmasWhenAllThroughTheHouse"
r = re.compile(".hri.t.asW.en") # constructs the search machinery
res = r.search(original_string) # search
print (res.group(0))            # get results
Run Code Online (Sandbox Code Playgroud)

结果将是:

ChristmasWhen
Run Code Online (Sandbox Code Playgroud)

现在,如果您的输入(搜索字符串)必须使用“-”作为通配符,您可以将其转换为正确的正则表达式:

import re 
original_string = "TwasTheNightBeforeChristmasWhenAllThroughTheHouse"
s = ".hri.t.asW.en"              # supposedly inputed by user
s = s.replace('-','.')           # translate to regexp syntax
r = re.compile(s)
res = r.search(original_string)
print (res.group(0))
Run Code Online (Sandbox Code Playgroud)