gpt4 book ai didi

python - 字符串正则表达式两个不匹配的 Python

转载 作者:太空狗 更新时间:2023-10-30 00:49:17 27 4
gpt4 key购买 nike

我如何扩展下面的代码以允许我探索我的子字符串和父字符串之间有 2 个或更少不匹配的所有实例?

子字符串:SSQP

要匹配的字符串:SSPQQQQPSSSSQQQSSQPSPSQSSQPSSQPPSSSSQPSPSQSSQPSSSSQPSPSQSSQPSSSSQPSPSQ

这是一个示例,其中仅包含一个可能的不匹配:

>>> s = 'SSPQQQQPSSSSQQQSSQPSPSQSSQPSSQPPSSSSQPSPSQSSQPSSSSQPSPSQSSQPSSSSQPSPSQ'
>>> re.findall(r'(?=(SSQP|[A-Z]SQP|S[A-Z]QP|SS[A-Z]P|SSQ[A-Z]))', s)
['SSQQ', 'SSQP', 'SSQP', 'SSQP', 'SSQP', 'SSQP', 'SSQP', 'SSQP', 'SSQP']

显然,在上面的代码中包含两个不匹配的可能性将需要对所有可能的组合进行大量的暴力输入。

我如何扩展此代码(或重构此代码)以探索两个不匹配的可能性?

此外,我想修改我的输出,以便获得子字符串与字符串匹配的确切位置的返回数字索引(不是 SSQQSSQP)。

最佳答案

你不必在这里使用re你可以使用itertools模块代替并节省大量内存。

您可以先提取所有长度为 4 的子字符串,然后将它们与您的 substring 进行比较,然后只选择那些与您的 substring 差异小于 2 的子字符串:

from itertools import izip,islice,tee

def sub_findre(s,substring,diffnumber):
sublen=len(substring)
zip_gen=(izip(substring,islice(s,i,i+sublen)) for i in xrange(len(s)))
for z in zip_gen:
l,z=tee(z)
if sum(1 for i,j in l if i==j)>=sublen-diffnumber:
new=izip(*z)
next(new)
yield ''.join(next(new))

演示:

s='SSPQQQQPSSSSQQQSSQPSPSQSSQPSSQPPSSSSQPSPSQSSQPSSSSQPSPSQSSQPSSSSQPSPSQ'

substring='SSQP'
print list(sub_findre(s,substring,2))

['SSPQ', 'SPQQ', 'QQQP', 'SSSS', 'SSSQ', 'SSQQ', 'SQQQ', 'SSQP', 'PSQS', 'SSQP', 'SSQP', 'SQPP', 'SSSS', 'SSSQ', 'SSQP', 'PSQS', 'SSQP', 'SSSS', 'SSSQ', 'SSQP', 'PSQS', 'SSQP', 'SSSS', 'SSSQ', 'SSQP', 'PSQ']

如果你想返回索引,你需要将索引放在 izip 中,你可以使用 itertools.repeat() 来重复长度为 子串 :

from itertools import izip,islice,tee,repeat

def sub_findre(s,substring,diffnumber):
sublen=len(substring)
zip_gen=(izip(substring,islice(s,i,i+sublen),repeat(i,sublen)) for i in xrange(len(s)))
for z in zip_gen:
l,z=tee(z)
if sum(1 for i,j,_ in l if i==j)>=sublen-diffnumber:
new=izip(*z)
next(new)
next(new)
yield next(new)[0]

演示:

print list(sub_findre(s,substring,2))
[0, 1, 4, 8, 9, 10, 11, 15, 20, 23, 27, 28, 32, 33, 34, 39, 42, 46, 47, 48, 53, 56, 60, 61, 62, 67]

关于python - 字符串正则表达式两个不匹配的 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31365168/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com