如果我在字符串中但部分甚至可以 python

If i in string but partial is even ok python

我确信这很简单,但我看不到或可能找不到解决方案。

假设我有一个字符串,例如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 上进行了测试。正则表达式中的点 . 表示 'match anything',因此它允许使用任何符号代替原始字母。

any returns True 如果这些正则表达式匹配,则立即,如果 none 匹配,则为假。