2

我正在尝试找到正确的 python 正则表达式来解决这个问题:

给定一个由字符?,_和组成的字符串o,找到一个长度n为仅包含?ando至少一个 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?]*贪婪地消耗了超出第一部分找到的块限制的字符。我希望先行将后续表达式限制在先行匹配的范围内,但我想这不是它的工作原理。

我最终可能会以另一种方式这样做,因为这对于正则表达式来说可能是最好的方法,但我想知道如何在单个正则表达式中做到这一点。

4

2 回答 2

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"
于 2013-03-10T02:01:40.510 回答
4

您不能使用前瞻来限制输入,因为它所做的只是(显然)对输入进行前瞻。如果在您在前瞻中指定的内容之后还有更多输入,仍然可以找到它。您可以使用前瞻来确保有一个 o (因为这是必要的)并使正则表达式更简单。

re.compile("(?=.{0," + str(n - 1) + "}o)[o?]{" + str(n) + "}")
于 2013-03-10T01:54:24.853 回答