2016-12-05 3 views
0

内の文字列から:[正規表現、パターンを削除する「[.../...]」私は例えばのための入力文字列を持っているのpython

input_str =「これは[何とか]のためのテストで、 blahhhh] '

と私は[blah]を保持したいが、上記の文字列から[blah/blahhhh]を削除したい。 「これは[何とか]とするテストである」として、出力を取得する権利正規表現パターンがどうあるべきか

>>>re.sub(r'\[.*?\]', '', input_str) 
'this is a test for and ' 

>>>re.sub(r'\[.*?\/.*?\]', '', input_str) 
'this is a test for ' 

: は、私は以下のコードを試してみましたか?

答えて

1

2番目の正規表現が機能しない理由を理解できません。私はそれをテストしました。正しい、正しく動作しません。だから、同じアイデアを使っても構いません。

代わりにワイルドカードを使用してのあなたは、このような\w使用することができます:あなたは/で区切られた以外の文字を持つことができる場合、あなたはこれを使用することができ、ちなみに

\[\w+\/\w+\] 

Working demo

を正規表現:

\[[^\]]*\/[^\]]*] 

Working demo

+0

は動作しません。 – DyZ

+0

@DYZ、コメントありがとうございます。はい、私は知っていますが、OPにはタグが付いているようです。 OPの考え方を見てみましょう。 Btw、downvoteでしたか? –

+0

@DYZ、私は別の正規表現を投稿しましたが、OPには単語がない文字が含まれています –

-1

このinput_strを引数としてループをループし、 '['と ']の間に'/'があると' ['が']'を含むすべての要素を削除します

0

元の投稿の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

関連する問題