我只能找到有关如何以任意顺序匹配多个子字符串或以最多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?
而不是.*
将解决此问题,但这根本不起作用(即使应该有一个也不匹配)。
有人知道解决方案吗?
在实际的模式中,我寻找的不仅仅是两个单独的字符串,所以写出每种可能的组合都是不可行的。
嗯,您的问题还不是很清楚,但是您可以尝试一下,假设word1,word2和word3是已知单词
(?:word1(\s\w+)?\sword2)|(?:word2(\s\w+)?\sword1)|word3
此问题不适用于正则表达式。
尚不完全清楚您的用例是什么,但请尝试获取您关心的每个术语的单词索引,并查看这些索引之间的距离,例如:
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