私の間違いは何ですか?
>>> import re
>>> re.sub("(\[*?)","\1","x[[[y")
'\x01x\x01[\x01[\x01[\x01y\x01'
どのようにできるのか ?
私の間違いは何ですか?
>>> import re
>>> re.sub("(\[*?)","\1","x[[[y")
'\x01x\x01[\x01[\x01[\x01y\x01'
どのようにできるのか ?
正規表現に生の文字列を使用します。
>>> import re
>>> re.sub(r'(\[*?)', r'\1', 'x[[[y')
'x[[[y'
あなたが書くとき'\1'
、\1
はエスケープシーケンスとして解釈されています。'\\1'
は、通常の文字列で記述する適切な方法です。これは、と同等r'\1'
です。
\[*?
しぶしぶ、0個以上の左角かっこに一致します。つまり、どこに適用しても、毎回何にも一致しません。
数量詞は通常貪欲です。つまり、正規表現全体を一致させながら、可能な限り一致させます。これが、ほとんどの場合「バックトラッキング」が意味することです。貪欲な数量詞は、必要なものと一致するように、正規表現の残りの部分が一致するように、食べた文字を返します。
気が進まない数量詞は正反対です。最初は最小数の文字を消費し、その後、全体的な一致を達成するために必要な場合にのみ、より多くの文字を消費します。しかし、あなたの場合、それは決して必要ではありません。\[*?
は正規表現全体であるため、空の文字列に一致する内容です。 正規表現の最後に気が進まない数量詞を使用することは、決して意味がありません。
考えられる混乱を解消するために、元の文字列の角かっこはキャプチャされて再挿入されておらず、とのようにそこに残されています。@Blenderが提案したように生の文字列を使用した場合(正しくは-それは別のエラーでした)、出力は元の文字列になります。x
y
>>> re.sub(r"(\[*?)",r"\1","x[[[y")
'x[[[y'
これは、すべての文字境界(つまり、開始と終了、および文字の各ペアの間)で空の文字列と一致し、それらを再挿入します-合計効果、なし。何を達成しようとしていたのかわかりませんが、3つの角かっこを1つに置き換えたい場合は、+
の代わりに使用*?
する必要があり、キャプチャグループの外に置く必要があります。
>>> re.sub(r"(\[)+",r"\1","x[[[y")
'x[y'