Эффективное неупорядоченное сопоставление подстроки

Я хочу сопоставить, если одна строка содержится в другой, независимо от порядка символов. Например, если у меня есть струнная подводная лодка, я хочу быть в состоянии обнаружить морских пехотинцев как совпадение.

Способ, которым я в настоящее время обращаюсь с этим, через списки:

def match(x, y):
    x, y = list(x), list(y)
    for i in x:
        try:
            y.remove(i)
        except ValueError:
            return False
    return True

Но это неэффективно, когда я пытаюсь сопоставить много комбинаций.

Я думал тогда использовать регулярное выражение, но не смог.

Есть идеи?

1 ответ

Решение

Вы можете использовать класс персонажа [SEARCH_WORD] где каждый символ будет искать независимо. Установив + квантификатор после него, вы будете искать 1 или более символов, и, добавив \b границы слов, вы будете соответствовать только целым словам:

r'\b[submarine]+\b'

Посмотрите демонстрацию regex и демонстрацию IDEONE:

import re
s = "I have a string submarine I want to be able to detect marines as a match"
kw = "submarine"
r  = re.compile(r"\b[{0}]+\b".format(kw))
print(r.findall(s))

ПРИМЕЧАНИЕ. Если введенные данные могут содержать несловесные символы, особенно такие символы, как ^, ], \ или же -спасайся с re.escape и использовать r"(?<!\w)[{0}]+(?!\w)".format(re.escape("submarine")),

import re
s = "I have a string ^submarine I want to be able to detect ^marines as a match"
kw = "^submarine"
r  = re.compile(r"(?<!\w)[{0}]+(?!\w)".format(re.escape(kw)))
print(r.findall(s))

Посмотреть демо IDEONE

Другие вопросы по тегам