如果多个子字符串按特定顺序匹配字符串

时间:2016-03-07 19:04:39

标签: python

我想知道如何检测两个子串是否与特定顺序的主字符串匹配。例如,如果我们在字符串中的任何位置查找"hours"然后"minutes",并且字符串为"what is 5 hours in minutes",则会返回true。如果字符串为"what is 5 minutes in hours",则会返回false

5 个答案:

答案 0 :(得分:2)

s = "what is 5 hours in minutes"
a, b = s.find("hours"),s.find("minutes")
print(-1 < a < b)

如果字符串中不存在b,您还可以避免检查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

哪个不匹配&#34; foo&#34;和&#34; bar&#34;在foobar:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

 if index(a) < index(b):
    True
 else:
    This

使用索引方法确定哪个首先出现。 if语句给出一个条件,一旦你发现哪个是第一个你做什么。你明白我想说什么吗?

答案 3 :(得分:0)

您可以使用正常表达式,例如“小时。*分钟”,或者您可以使用查找“小时”的简单字符串搜索,记下找到它的位置,然后再搜索“分钟”开始在那个地方。

答案 4 :(得分:0)

正则表达式在这里运作良好。正则表达式“小时。*分钟”表示查找小时数,但是0或更多任何字符后跟分钟。此外,请确保使用正则表达式库中的search函数而不是match,因为匹配会从字符串的开头检查。

import re
true_state ="what is 5 hours in minutes"
false_state = "what is 5 minutes in hours"
pat = re.compile(r"hours.*minutes")
statements = [true_state, false_state]
for state in statements:
    ans= re.search(pat, state)
    if ans:
        print state
        print ans.group()

输出

what is 5 hours in minutes
hours in minutes