2016-07-08 22 views
0

私は検索パターンを探しています。他のパターンの中には追従すべきではない特定のパターンがあります。何らかの形でこのパターンが存在する場合は、<>文字のあとに、\文字をエスケープする必要があります。文字がパターンに含まれていない場合、文字が存在する可能性があります。regex:文字が存在し、その後に別のエスケープ文字が続く必要があります

私は、このようにそれをやってみました: input_string = '<First tag:<Second tag:hello>tag ends>' re.findall('(?<!\\)<.*?:.*?(?<!\\)>',input_string)

予想される出力: ['<Second tag:hello>']

私は何を得たことである: ['<First tag:<Second tag:hello>']

私はこのパターンで試してみました: (?<!\\)<[^(?<!\\)<.*:]+:[^(?<!\\)<.*:]+?(?<!\\)>

は、これは上記の例を渡します。この入力に対して: input_str = '<First tag:\<Second tag:hello>tag ends> <First tag:<Second tag:hello\>tag ends> <First tag:\<Second tag:hello\>tag ends>' それは失敗します。

これは、予想される出力です: ['<First tag:\<Second tag:hello>','<Second tag:hello\>tag ends>','<First tag:\<Second tag:hello\>tag ends>']

+1

の例として<a:a>は無限のネスティングで何かを解析する正規表現を使用しないでください。それは動作しません。 –

+0

それで、最も内側にエスケープされていない '<' to '>'が欲しいですか?それは正規表現で実行可能なはずです。 – TemporalWolf

+0

@TemporalWolfはい、まさに.. ':'で '<' and '> ' – Sohn

答えて

0

(?<!\\)<(?:[^<>]|\\<|\\>)+:(?:[^<>]|\\<|\\>)*[^\\]>

は与える:

内訳:

(?<!\\)負の表情あなたの第二の例について

$1 - <First tag:\<Second tag:hello> 
$1 - <Second tag:hello\>tag ends> 
$1 - <First tag:\<Second tag:hello\>tag ends> 

後ろに - それはそれの前に\で始めることができません。私はグループのものにしたいが、私は追加のグループ

[^<>] Any character that is not an angle bracket 

| or 

\\< An escaped left bracket 

| or 

\\> An escaped right bracket 

)+グループを閉じてしたくない...:

<

は非キャプチャグループを起動 (?:開口角度ブラケット

を開始しますそれを1回以上複製する。

:セミコロン

(?:[^<>]|\\<|\\>)*同じ非キャプチャ基、0回以上。

[^\\]>最後に、\を除くすべての文字で終わる必要があります。それがエスケープされる必要があるので、\\が使用されます。

regex101リンクをテストしたい場合は、このリンクをクリックしてください。

この更新された正規表現は受け入れます:最小の有効な一致

+0

:これはまだ' 'や'/'のような不要な入力を受け入れます。これを ''の形式にしたいが、入れ子にしないでください。 – Sohn

+0

要求通りに修正されました。 – TemporalWolf

+0

あなたの努力に感謝します。これらの文字がパターンに含まれていない場合、これらの 'Some tag'と' Another tag'は内部に '<' and '>'を含むことができます。 ''これは第2として受け入れられます。 '<'はパターンにありません。 – Sohn

関連する問題