如果我在字符串中但部分甚至可以 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 匹配,则为假。
我确信这很简单,但我看不到或可能找不到解决方案。
假设我有一个字符串,例如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 匹配,则为假。