Эффективное неупорядоченное сопоставление подстроки
Я хочу сопоставить, если одна строка содержится в другой, независимо от порядка символов. Например, если у меня есть струнная подводная лодка, я хочу быть в состоянии обнаружить морских пехотинцев как совпадение.
Способ, которым я в настоящее время обращаюсь с этим, через списки:
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