如果多个子字符串与特定ord中的字符串匹配

2024-03-29 06:12:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何检测两个子字符串是否按特定顺序匹配主字符串。例如,如果我们在字符串中查找"hours",然后在任何地方查找"minutes",而字符串是"what is 5 hours in minutes",它将返回true。如果字符串是"what is 5 minutes in hours",它将返回false。你知道吗


Tags: 字符串infalsetrue顺序is地方what
3条回答
s = "what is 5 hours in minutes"
a, b = s.find("hours"),s.find("minutes")
print(-1 < a < b)

如果字符串中不存在a,也可以避免检查b:

 def inds(s, s1, s2):
    a = s.find(s1)
    return -1 < a < s.find(s2)

如果您想从+1开始,则可以进行以下更改:

def inds(s, s1, s2):
    a = s.find(s1)
    return -1 < a < s.find(s2, a+1)

但是如果你总是想确保a在b之前,那么就坚持第一个解决方案。您也没有说明子字符串是否可以匹配,即:

a = "foo"
b = "bar"

将匹配:

"foobar"

但它们不是字符串中的实际单词。如果您想匹配实际的单词,那么您要么需要分割和清理文本,要么使用正则表达式的单词边界。你知道吗

如果要匹配精确的单词而不是部分匹配,请使用正则表达式并使用单词边界:

import re


def consec(s, *args):
    if not args:
        raise ValueError("args cannot be empty")
    it = iter(args)
    prev = re.search(r"\b{}\b".format(next(it)), s)
    if not prev:
        return False
    prev = prev.end() 
    for w in args:
        ind = re.search(r"\b{}\b".format(w), s, prev + 1)
        if not ind:
            return False
        prev = ind.end() 
    return True

与foobar中的“foo”和“bar”不匹配:

In [9]: consec("foobar","foo","bar")
Out[9]: False

In [10]: consec("foobar bar for bar","foo","bar")
Out[10]: False

In [11]: consec("foobar bar foo bar","foo","bar")
Out[11]: True

In [12]: consec("foobar","foo","bar")
Out[12]: False

In [13]: consec("foobar bar foo bar","foo","bar")
Out[13]: True

In [14]: consec("","foo","bar")
Out[14]: False

In [15]: consec("foobar bar foo bar","foobar","foo","bar")
Out[15]: True

您可以使用诸如“hours.*minutes”之类的正则表达式,也可以使用简单的字符串搜索来查找“hours”,记下找到它的位置,然后从该位置开始再次搜索“minutes”。你知道吗

这将适用于任何一组单词和任何字符串:

def containsInOrder(s, *words):
    last = -1
    for word in words:
        last = s.find(word, last + 1)
        if last == -1:
            return False
    return True

像这样使用:

>>> s = 'what is 5 hours in minutes'
>>> containsInOrder(s, 'hours', 'minutes')
True
>>> containsInOrder(s, 'minutes', 'hours')
False
>>> containsInOrder(s, '5', 'hours', 'minutes')
True
>>> containsInOrder('minutes hours minutes', 'hours', 'minutes')
True
>>> containsInOrder('minutes hours minutes', 'minutes', 'hours')
True

相关问题 更多 >