我想知道如何檢測兩個子字符串是否與特定順序的主字符串匹配。例如,如果我們在字符串中查找"hours"
然後"minutes"
任何地方,並且字符串是"what is 5 hours in minutes"
,則它將返回true
。如果字符串是"what is 5 minutes in hours"
,它將返回false
。如果多個子字符串按特定順序匹配字符串
回答
if index(a) < index(b):
True
else:
This
使用索引方法來確定哪個先來。 if語句給出了一個有條件的信息,告訴你一旦你找到了第一個信息後你會做什麼。你明白我想說什麼嗎?
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
這不適用於字符串「分鐘小時分鐘」,其中「小時」確實出現在「分鐘」之前。您需要搜索從「a + 1」位置開始的「分鐘」。 –
@MathiasRav,我會把它留給OP來決定什麼,但如果它是必需的,那麼這是一個簡單的修復。 –
@ShaneSmiskol記住@MathiasRav的評論。如果你的字符串是'分鐘小時分鐘',這將返回'false'' – Kupiakos
這將任何一組詞和任何字符串工作:
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
'containsInOrder(「foo」) - > True' –
@PadraicCunningham它包含空字符串。 – Kupiakos
什麼是空字符串?我什麼都沒有通過 –
您可以使用正則表達式,例如「hours。*分鐘」,或者您可以使用尋找「小時」的簡單字符串搜索,記錄找到它的位置,然後執行另一個搜索從那個位置開始的「分鐘」。
正則表達式在這裏可以很好地工作。正則表達式「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
- 1. 匹配沒有任何順序的字符串子字符串
- 2. 特定字符後字符串匹配
- 3. 在sed中匹配字符串中的特定子字符串
- 4. Laravel順序按特定的字符串
- 5. 用字符串匹配子字符串
- 6. 僅當匹配字符串時,如果沒有另一個特定字符串
- 7. 匹配多個字符串
- 8. 匹配多個字符串
- 9. 刪除字符串如果最終字符串匹配給定的字符串
- 10. 查找在特定子字符串中匹配的多個組
- 11. Antlr字符串匹配順序
- 12. 從字符串中提取特別匹配的子字符串
- 13. 匹配字符串匹配,如果
- 14. C# - 如果字典中的值匹配<字符串,字符串>匹配指定的字符串
- 15. 將最近的字符串與特定的字符串匹配
- 16. 基於特定字符串匹配的分隔字符串
- 17. 不匹配字符串,如果它包含特定的字
- 18. PyMongo:子字符串匹配獨立於字順序
- 19. SQL Server - 多列子字符串匹配
- 20. 提取部分匹配兩個子字符串的字符串
- 21. string1的哪個子字符串與字符串2匹配
- 22. 如何匹配字符串,如果不是另一個字符串的子字符串?
- 23. 如何從C#中的字符串中提取多個子字符串匹配?
- 24. 從字符串中刪除特定的匹配子字符串python
- 25. grep爲特定順序的字符串
- 26. 如何匹配字符串中的特定字符n-m次
- 27. 如何獲得基於字符串順序匹配的字符串模式
- 28. 匹配多個字符串多的NSArray
- 29. 按字母順序排序字符串
- 30. 排序字符串按字母順序
正則表達式? '/小時。*分鐘/'? –
如果您需要單詞邊界,則使用'\ b'\ bhours \ b。* \ bminutes \ b' – Rik