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

Python 如果子字符串替换了随机字符,如何查找子字符串?,python,string,algorithm,substring,Python,String,Algorithm,Substring,假设我们在Python中有一个字符串: original_string = "TwasTheNightBeforeChristmasWhenAllThroughTheHouse" 我们感兴趣的是找到子字符串substring=“ChristmasWhen”的起始坐标。这在Python中非常简单,即 >>> substring ="ChristmasWhen" >>> original_string.find(substring) 18 这就证实了 >

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

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

>>> substring ="ChristmasWhen"
>>> original_string.find(substring)
18
这就证实了

>>> "TwasTheNightBeforeChristmasWhenAllThroughTheHouse"[18]
'C'
如果我们试图查找不存在的字符串,
find()
将返回-1

我的问题是:

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

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

下面是一个具体的例子:

original_string = "TwasTheNightBeforeChristmasWhenAllThroughTheHouse"
substring = '-hri-t-asW-en'

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

这就是正则表达式的典型用途:查找模式。然后,您可以尝试:

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
结果将是:

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

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))

也许使用正则表达式?例如,可以使用
(点字符)匹配任何字符(默认情况下,换行符除外)。因此,如果将子字符串修改为使用点而不是破折号来表示字符串中已擦除的字母,则可以使用
re.search
查找这些模式:

text = 'TwasTheNightBeforeChristmasWhenAllThroughTheHouse';
re.search('.hri.t.asW.en', text)

您可以使用常规表达式来查找匹配项和保留项

重新导入
p=重新编译(“.hri.t.asW.en”)
对于p.finditer中的m(“圣诞节前的晚上,当他在家里的时候”):
打印(m.start(),m.group())
外出:(18个圣诞节)

非正则表达式方法,效率低于后者,但仍有可能:

o = "TwasTheNightBeforeChristmasWhenAllThroughTheHouse"
s = '-hri-t-asW-en'
r = next(i for i in range(len(o)-len(s)) if all(a == b or b == '-' for a, b in zip(o[i:i+len(s)], s)))
输出

18

是的,这就是regexp的用途。用rexexp模块搜索“.hri.t.asW.en”。当你得到子字符串时,你知道哪个是奇怪的字符吗?另外,整个子串的密码是相同的吗,或者可能是,例如,
-
-
作为同一子串中的入侵者吗?@PedroAlves我知道这个奇怪的字符是什么。这只是
-
那么@Jean BaptisteYunès的建议就是:将您的输入转换为正确的正则表达式模式(基本上只需将
-
替换为
),并使用该模式搜索字符串(有关文档,请参阅
re
模块),您需要将
-
替换为
。只需
substring=substring。替换(“-”,“)
谢谢您的回答!我还没有意识到这种功能是以用户友好的形式存在的