我正在尝试找到合适的python正则表达式来解决这个问题:
给定由字符?
,_
和o
组成的字符串,找到仅包含n
和{{?
的长度为o
的子字符串1}}和至少一个 o
。
这是我提出来的,但它似乎没有起作用:
n = 3
r = re.compile("
(?=[o?]{"+str(n)+","+str(n)+"}) # first find a block of n characters that are either 'o' or '?'
[o?]*o[o?]* # then check if that block has at least one 'o'
, re.VERBOSE")
我认为上面的问题是前瞻正确找到了一个潜在的阻止,但是[o?]*o[o?]*
贪婪地消耗了超出第一部分找到的阻止限制的字符。我希望前瞻会限制后续表达式在前瞻匹配的范围内匹配,但我想这不是它的工作方式。
我可能最终会采用另一种方式,因为这可能是正则表达式最好的方法,但我想知道如何在单个正则表达式中执行此操作。
答案 0 :(得分:5)
你甚至不需要正则表达式。
pieces = s.split('_') # pieces are composed of only ? and o
for piece in pieces:
if 'o' in piece and len(piece) >= n: # piece must have a substring of length n with o in it somewhere
print "found it"
break
else:
print "didn't find it"
答案 1 :(得分:4)
您不能使用前瞻来限制输入,因为它只是向前看(显然)输入。如果在前瞻中指定的内容之后有更多输入,则仍可以找到它。你可以使用前瞻来确保有一个o(因为这是必要的)并使正则表达式更简单。
re.compile("(?=.{0," + str(n - 1) + "}o)[o?]{" + str(n) + "}")