如果多个子字符串按特定顺序匹配字符串
我想知道如何检测两个子字符串是否与特定顺序的主字符串匹配。例如,如果我们在字符串中查找"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
正则表达式? '/小时。*分钟/'? –
如果您需要单词边界,则使用'\ b'\ bhours \ b。* \ bminutes \ b' – Rik