Python:正则表达式恰好是$ n $ [?o],至少有一个[o]

时间:2013-03-10 01:36:47

标签: python regex

我正在尝试找到合适的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?]*贪婪地消耗了超出第一部分找到的阻止限制的字符。我希望前瞻会限制后续表达式在前瞻匹配的范围内匹配,但我想这不是它的工作方式。

我可能最终会采用另一种方式,因为这可能是正则表达式最好的方法,但我想知道如何在单个正则表达式中执行此操作。

2 个答案:

答案 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) + "}")