以任何顺序匹配单词列表,但仅当相邻/以最多n个单词分隔时

问题描述 投票:0回答:2

我只能找到有关如何以任意顺序匹配多个子字符串或以最多n个字分隔(不能一次都匹配)的建议。

我需要在python中实现一个条件,在该条件下,多个术语以任意顺序出现,但以例如最多一个单词或相邻单词。我已经找到了一种使用环视实现“以任何顺序”部分的方法,但是它并没有考虑到相邻单词/分隔单词最多为一个单词的问题。举例说明:

re.search("^.*(?=.*word1\s*\w*\sword2)(?=.*\w*)(?=.*word3\w*).*$", "word1 filler word2 and word3")

这应该以任何顺序匹配"word1 word2""word1 max1word word2""word3*",在这种情况下,用一个单词分隔-确实如此。但是,它还会匹配一个字符串,在该字符串中,术语用两个或多个单词分隔,这是不应该的。我尝试这样做:

re.search("^.*(?=\s?word1\s*\w*\sword2)(?=\s?\w*)(?=\s?word3\w*).*$", "word1 word2 word3")

希望在每个带括号的术语的开头使用\s?而不是.*将解决此问题,但这根本不起作用(即使应该有一个也不匹配)。

有人知道解决方案吗?

在实际的模式中,我寻找的不仅仅是两个单独的字符串,所以写出每种可能的组合都是不可行的。

python regex regex-lookarounds
2个回答
0
投票

嗯,您的问题还不是很清楚,但是您可以尝试一下,假设word1word2word3是已知单词

(?:word1(\s\w+)?\sword2)|(?:word2(\s\w+)?\sword1)|word3

Demo


0
投票

此问题不适用于正则表达式。

尚不完全清楚您的用例是什么,但请尝试获取您关心的每个术语的单词索引,并查看这些索引之间的距离,例如:

def my_function(string, word1, word2, max_distance=2):
    words = string.split()

    try:
        index1 = words.index(word1)
        index2 = words.index(word2)

        if abs(index1 - index2) <= max_distance:
            return True

    except ValueError:
        pass

    return False

my_function("word1 filler word2 and word3", "word1", "word2")
# => True

my_function("word1 filler word2 and word3", "word2", "word1")
# => True

my_function("word1 filler word2 and word3", "word1", "word3")
# => False

my_function("word1 filler word2 and word3", "word3", "filler", max_distance=3)
# => True
© www.soinside.com 2019 - 2024. All rights reserved.