元の投稿の2番目の正規表現がOPよりも多く一致するのは、.
が]
などの任意の文字と一致するためです。したがって\[.*?\/'
(または/
が余分になる前に\
があるので\[.*?/
)は、OPが望んでいたよりも多く一致します。[blah] and [blah/
はinput_str
です。
?
は混乱を招きます。それは.*\]
の部分式の.*
部分の繰り返しを制限しますが、あなたはあなたが[1]を制限していることを理解しなければなりません。まず、.
ワイルドカードではなく、閉じていない括弧を明示的にマッチさせることをお勧めします。 .*
のいわゆる "欲張りな"マッチングは、多くの場合、そのワイルドカードのマッチが失敗するまで(通常は予想よりもはるかに長い)、の任意の文字の0回以上の出現と一致するため、不安定なブロックになります。あなたの場合は、最後に正規表現の次の明示的に指定された部分(正規表現で]
または/
)が出現するまで、できるだけ多くの入力を貪欲にマッチさせます。 ?
を使用して怠惰なマッチングで貪欲なマッチングを妨害または制限しようとするのではなく、貪欲な部分で何をマッチさせないかを明確にする方がよい場合がよくあります。実例として
、.*
後の文字の最後が発生するまで.*
つかんで、すべての以下の例を参照してください。
echo '////k////,/k' | sed -r 's|/.*/|XXX|'
XXXk
echo '////k////,/k' | sed -r 's|/(.*)?/|XXX|'
XXXk
そして貪欲/怠惰なマッチングの動作の機微が、1つの正規表現の実装によって異なることができます次のもの(pcre、python、grep/egrep)。移植性と簡潔さ/明快さのために、可能な場合は明示してください。
スラッシュ文字の前に閉じ括弧文字が含まれていない括弧で囲まれた文字列だけを検索する場合は、ワイルドカードの一致の代わりに「非閉じる括弧」を明示的に探すことができます。
[^]]
- -
re.sub(r'\[[^]]*/[^]]*\]', '', input_str)
'this is a test for [blah] and '
これは、文字クラスの表現を使用して代わりにワイルドカード.
で明示的に閉じ括弧ではない任意の文字にマッチします。
入力ストリームで "スラッシュ"の前に角括弧( ")の中に閉じ括弧が1つ以上あることが"合法 "の場合は、括弧で囲まれたかどうかを判断する必要があるため、ネストされたサブ式。トークンパーサーの仕事のように聞こえ始めています。
あなたが実際に達成しようとしているもの(これは多分もっと複雑なもののダミーの例であると思われます)と入力に許可されているものによっては、上記の単純な変更以上のものが必要な場合があります。しかし、それはとにかくあなたの例のために働く。
(スペースなど)カッコ内の任意の非単語の文字がある場合は、[1] http://www.regular-expressions.info/repeat.html
は動作しません。 – DyZ
@DYZ、コメントありがとうございます。はい、私は知っていますが、OPにはタグが付いているようです。 OPの考え方を見てみましょう。 Btw、downvoteでしたか? –
@DYZ、私は別の正規表現を投稿しましたが、OPには単語がない文字が含まれています –