高效的无序分段匹配

时间:2016-03-29 08:28:00

标签: python regex pattern-matching python-2.5

如果一个字符串包含在另一个字符串中,我想匹配,无论字符的顺序如何。 例如,如果我有一个字符串潜艇,我希望能够将海军陆战队检测为匹配。

我目前正在处理的方式是通过列表:

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 个答案:

答案 0 :(得分:2)

您可以使用字符类 [SEARCH_WORD],其中每个字符都将被独立搜索。通过在其后设置+量词,您将查找1个或多个字符,并通过添加\b字边界,您只会匹配整个字词:

r'\b[submarine]+\b'

请参阅the regex demoIDEONE demo

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 demo