2

私はこの問題を解決するために正しいPython正規表現を見つけようとしています:

?文字、、、_およびで構成される文字列が与えられた場合、およびと少なくとも1つだけを含むo長さの部分文字列を見つけます。n?o 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 に答える