Вы можете ограничить размытость раздела шаблона между слешами, используя следующую реализацию по вашему желанию ideal_function()
:
def ideal_function(pattern_string, query_string, fuzzy='e<=2'):
prefix, body, suffix = pattern_string.split('/')
r = regex.compile('%s/(%s){%s}/%s' % (prefix, body, fuzzy, suffix))
return r.match(query_string) is not None
Вот оно в действии:
>>> ideal_function('ATAG/GAGAAGATGATG/TATA', 'ATAG/AGCAAGATGATG/TATA')
True
>>> ideal_function('ATGG/GAGAAGATGATG/TATA', 'ATAG/AGCAAGATGATG/TATA')
False
>>> ideal_function('ATAG/GAGAAGATGATG/TATA', 'ATAG/AGCAAGATGATG/TATA', 'e<=1')
False
>>> ideal_function('ATAG/GAGAAGATGATG/TATA', 'ATAG/AGCAAGATGATG/TATA', 'e<=2')
True
>>> ideal_function('ATAG/GAGAAGATGATG/TATA', 'ATAG/AGCAAGATGATG/TATA', 's<=2')
False
>>> ideal_function('ATAG/GAGAAGATGATG/TATA', 'ATAG/AGCAAGATGATG/TATA', 's<=3')
True
Это зависит от того, что вы всегда имеете в шаблоне ровно три разделенных косой чертой раздела, но поскольку для чего-то более обобщенного потребуется также указать, какие разделы нечеткие, а какие нет, я предполагаю, что этот простой подход подходит для вашего варианта использования.
Любая версия ideal_function()
, которая должна создавать соответствующее регулярное выражение каждый раз, когда оно вызывается, вероятно, не будет самым эффективным подходом, кстати (хотя вам придется выполнить некоторое профилирование, чтобы определить, сколько разница, которая на самом деле имеет значение в вашем конкретном случае).
В зависимости от того, какой вывод вам нужен, что-то вроде этого может иметь больше смысла:
def ideal_generator(pattern_string, all_query_strings, fuzzy='e<=2'):
prefix, body, suffix = pattern_string.split('/')
r = regex.compile('%s/(%s){%s}/%s' % (prefix, body, fuzzy, suffix))
for query_string in all_query_strings:
if r.match(query_string) is not None:
yield query_string
… что даст все строки запроса, соответствующие pattern_string
.