2016-03-07 52 views
2

我想知道如何檢測兩個子字符串是否與特定順序的主字符串匹配。例如,如果我們在字符串中查找"hours"然後"minutes"任何地方,並且字符串是"what is 5 hours in minutes",則它將返回true。如果字符串是"what is 5 minutes in hours",它將返回false如果多個子字符串按特定順序匹配字符串

+7

正則表達式? '/小時。*分鐘/'? –

+0

如果您需要單詞邊界,則使用'\ b'\ bhours \ b。* \ bminutes \ b' – Rik

回答

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

使用索引方法來確定哪個先來。 if語句給出了一個有條件的信息,告訴你一旦你找到了第一個信息後你會做什麼。你明白我想說什麼嗎?

2
s = "what is 5 hours in minutes" 
a, b = s.find("hours"),s.find("minutes") 
print(-1 < a < 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 

,不會匹配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 
+0

這不適用於字符串「分鐘小時分鐘」,其中「小時」確實出現在「分鐘」之前。您需要搜索從「a + 1」位置開始的「分鐘」。 –

+0

@MathiasRav,我會把它留給OP來決定什麼,但如果它是必需的,那麼這是一個簡單的修復。 –

+0

@ShaneSmiskol記住@MathiasRav的評論。如果你的字符串是'分鐘小時分鐘',這將返回'false'' – Kupiakos

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 
+0

'containsInOrder(「foo」) - > True' –

+0

@PadraicCunningham它包含空字符串。 – Kupiakos

+0

什麼是空字符串?我什麼都沒有通過 –

0

您可以使用正則表達式,例如「hours。*分鐘」,或者您可以使用尋找「小時」的簡單字符串搜索,記錄找到它的位置,然後執行另一個搜索從那個位置開始的「分鐘」。

0

正則表達式在這裏可以很好地工作。正則表達式「hours。* minutes」表示查找小時數,但是有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 
相關問題