2017-02-23 2 views
1

をre.findall:Pythonは、同様に私をテキスト2与えなぜPythonは、私は次のコードでのみ「テキスト3」の部分を取得しようとしている非欲張り結果

import re 
stringtotest = "begin:Text1<wrong>Text2<wrong>Text3<right>Text4<wrong>" 
right = re.findall("<wrong>(.+?)<right>",stringtotest) 
>>> right 
['Text2<wrong>Text3'] 

?私に最も近い「間違った」の後の部分だけを欲しいと告げるには?ありがとうございました。

+0

この質問にも非欲張りマッチが所望の結果を得るために失敗することから、非貪欲対貪欲とはほとんどされています。質問者はレイジーマッチを使用しています。これは攻撃的ではありません。 –

+0

あなたは絶対に正しいです。 –

+0

申し訳ありませんが、私はPythonを初めて使いました。もし文字列が "begin \ r \ nText1 \ r \ n\ r \ nText2 \ r \ n何らかのテキスト\ r \ n\ r \ nText3 \ r \ n \ r \ nText4 \ r \ n "どうすればの前に部品を手に入れることができますか? – alexanderk409

答えて

4

ドット.は何でも一致します。あなたは、外側のタグなしで中央のセクションを取得したい場合は、タグの位置を主張するために先読みしてlookbehindsを使用し、

<wrong>([^<]+?)<right> 

:あなたは試合を制限するために否定文字クラスを使用することができます

(?<=<wrong>)([^<]+?)(?=<right>) 
+0

ここでは欲張りマッチングを使用するべきではありません。欲張りマッチングは正しい "ここの境界"を超えることはできません。貪欲に、 '>'を閉じることと '<'を開くことの間で文字を突き合わせるために1つのステップが必要です。しかし、多くのregexエンジン(もちろん、Pythonには不安はありません)は内部的に '[^ <]+<' to '(?> [^ <] +)<'を最適化して不要なバックトラッキングを避けています。 –

+0

あなたはそうです、私はそれを編集しようとしていましたが、私は20ステップを節約することは尋問者にとって重要ではないと考えました。しかし、他の視聴者のための良い情報、コメントありがとう。 –

1
<wrong>((?:(?!<wrong>).)*)<right> 

デモを使用して、先取りされたルックアヘッドベースの量制限子を使用できます。

https://regex101.com/r/8yUhDL/1

関連する問題