我敢肯定这很简单,但是我看不到或者可能找不到解决方案。
假设我有一个字符串,例如something--abcd--something
,我想abcc
在字符串中查找。我想允许一个不匹配,这意味着以下代码的输出应为True
。
my_string='something--abcd--something'
substring = 'abcc'
if substring in my_string:
print('True')
else:
print('False')
我知道substring
不在,my_string
但是我想要的是允许一个不匹配,然后输出将为True。
我该如何实现?
当然有更好的方法,但是一种解决方案是使用正则表达式来搜索它,其中一个字符替换为一个点(如果希望该字符为字母,则不要用'\ w'代替)。
我们使用生成器通过每次替换其中一个字母来延迟生成正则表达式,然后检查以下任何正则表达式是否匹配:
import re
def with_one_dot(s):
for i in range(len(s)):
yield s[:i] + '.' + s[i+1:]
def match_all_but_one(string, target):
return any(re.search(fuzzy_target, string) for fuzzy_target in with_one_dot(target))
def find_fuzzy(string, target):
" Return the start index of the fuzzy match, -1 if not found"
for fuzzy_target in with_one_dot(target):
m = re.search(fuzzy_target, string)
if m:
return m.start()
return -1
my_string = 'something--abcd--something'
print(match_all_but_one(my_string, 'abcc')) # 1 difference
# True
print(find_fuzzy(my_string, 'abcc'))
# 11
print(match_all_but_one(my_string,'abbb')) # 2 differences
# False
print(find_fuzzy(my_string, 'abbb'))
# -1
该with_one_dot(s)
发生器所产生的s
一个字母通过在每个迭代点取代:
for reg in with_one_dot('abcd'):
print(reg)
输出:
.bcd
a.cd
ab.d
abc.
这些字符串中的每一个都用作正则表达式,并在上进行了测试my_string
。.
正则表达式中的点表示“匹配任何内容”,因此它允许使用任何符号代替原始字母。
any
True
如果这些正则表达式匹配,则立即返回;如果不匹配,则返回False。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句