0

私の間違いは何ですか?

>>> import re
>>> re.sub("(\[*?)","\1","x[[[y")
'\x01x\x01[\x01[\x01[\x01y\x01'

どのようにできるのか ?

4

2 に答える 2

2

正規表現に生の文字列を使用します。

>>> import re
>>> re.sub(r'(\[*?)', r'\1', 'x[[[y')
'x[[[y'

あなたが書くとき'\1'\1はエスケープシーケンスとして解釈されています。'\\1'は、通常の文字列で記述する適切な方法です。これは、と同等r'\1'です。

于 2012-10-21T02:16:47.013 に答える
1

\[*?しぶしぶ、0個以上の左角かっこに一致します。つまり、どこに適用しても、毎回何にも一致しません。

数量詞は通常貪欲です。つまり、正規表現全体を一致させながら、可能な限り一致させます。これが、ほとんどの場合「バックトラッキング」が意味することです。貪欲な数量詞は、必要なものと一致するように、正規表現の残りの部分が一致するように、食べた文字を返します。

気が進まない数量詞は正反対です。最初は最小数の文字を消費し、その後、全体的な一致を達成するために必要な場合にのみ、より多くの文字を消費します。しかし、あなたの場合、それは決して必要ではありません。\[*?は正規表現全体であるため、空の文字列に一致する内容です。 正規表現の最後に気が進まない数量詞を使用することは、決して意味がありません。

考えられる混乱を解消するために、元の文字列の角かっこはキャプチャされて再挿入されておらず、とのようにそこに残されています。@Blenderが提案したように生の文字列を使用した場合(正しくは-それは別のエラーでした)、出力は元の文字列になります。xy

>>> re.sub(r"(\[*?)",r"\1","x[[[y")
'x[[[y'

これは、すべての文字境界(つまり、開始と終了、および文字の各ペアの間)で空の文字列と一致し、それらを再挿入します-合計効果、なし。何を達成しようとしていたのかわかりませんが、3つの角かっこを1つに置き換えたい場合は、+の代わりに使用*?する必要があり、キャプチャグループの外に置く必要があります。

>>> re.sub(r"(\[)+",r"\1","x[[[y")
'x[y'
于 2012-10-21T02:53:36.333 に答える