1

最初と最後が同じ長さの場合に一致する正規表現をどのように作成しますか?例えば

>>> String = '[[A], [[B]], [C], [[D]]]'
>>> Result = re.findall(pattern, String)
>>> Result
>>> [ '[A]', '[[B]]', '[C]', '[[D]]' ]

現在はパターンを使用しています\[.*?\]が、結果として

>>> ['[[A]', '[[B]', '[C]', '[[D]']

前もって感謝します。

4

3 に答える 3

4

このような正規表現は、有限数の開始/終了文字に対して定義できます (つまり、「開始と終了が 1 である場合、または開始と終了が 2 である場合」など)。ただし、無制限の文字数に対してこれを行うことはできません。これは単なる正規表現の事実です。正規表現は有限状態マシンの言語であり、有限状態マシンはカウントを行うことができません。そのためには、少なくともプッシュダウン オートマトン (文脈自由文法) の力が必要です。

簡単に言えば、正規表現は「私はxを見た後、私はyを見ました」と言うことができますが、 「私はxを見た後、同じ回数yを見た」とは言えませ

ただし、チューリング完全である Python プログラミング言語の全機能を使用して、これを簡単に行うことができます。チューリング完全な言語は間違いなく数えることができます:

>>> string = '[[A], [[B]], [C], [[D]]]'
>>> sameBrackets = lambda s: len(re.findall('\[',s)) == len(re.findall('\]',s))
>>> filter(sameBrackets, string.split(", "))
['[[B]]', '[C]']
于 2012-05-06T06:28:16.063 に答える
3

できません。ごめん。

Python の正規表現は、「有限状態オートマトン」の拡張であり、一致する文字列をスキャンする際に、限られた量のメモリしか保持できません。この例では、繰り返しの回数に応じて、任意の量のメモリが必要です。

Python が有限状態以上のものを許可する唯一の方法は、「後方参照」を使用することです。これにより、文字列の以前に一致した部分の同一のコピーを一致させることができますが、何かを一致させることはできません。同じ文字数。

代わりに、これを手で書いてみてください。

于 2012-05-06T06:30:30.467 に答える
0

釣り合った括弧を一致させるには、再帰的な正規表現が必要です。ストックreモジュールはこの構文をサポートしていませんが、代わりの正規表現はサポートしています。

import regex

r = r'\[(([^\[\]]+)|(?R))*\]'

print regex.match(r, '[[A], [[B]], [C], [[D]] ]') # ok
print regex.match(r, '[[A], [[B]], [C , [[D]] ]') # None

その式は基本的に次のように言っています: 括弧で囲まれたものに一致します。ここで、「何か」は一連の非括弧([^\[\]]+)または全体のいずれか(?R)です。

于 2012-05-06T11:17:36.293 に答える