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

2024-05-02 09:09:02 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们在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


Tags: 字符串string字母substringfind字符感兴趣en
3条回答

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

import re
p = re.compile(".hri.t.asW.en")
for m in p.finditer('TwasTheNightBeforeChristmasWhenAllThroughTheHouse'):
    print(m.start(), m.group())

out: (18 ChristmasWhen)

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

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

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

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

相关问题 更多 >