コード:
str = '<br><br />A<br />B'
print(re.sub(r'<br.*?>\w$', '', str))
が<br><br />A
返されるはずですが、空の文字列が返されます''
。
なにか提案を?
コード:
str = '<br><br />A<br />B'
print(re.sub(r'<br.*?>\w$', '', str))
が<br><br />A
返されるはずですが、空の文字列が返されます''
。
なにか提案を?
貪欲は左から右に作用しますが、それ以外では作用しません。これは基本的に「一致に失敗しない限り、一致しない」という意味です。何が起こっているかは次のとおりです。
<br
は、文字列の先頭で一致します。.*?
今のところ無視されます。怠惰です。>
とすると、成功します。\w
失敗します。興味深いことに、エンジンはバックトラックを開始し、.*?
ルールを確認します。この場合、.
は最初の に一致する可能性が>
あるため、その一致にはまだ希望があります。>\w
、一致できますが、$
失敗します。繰り返しますが、エンジンは遅延ルールに戻り、.*
一致するまで一致を続けます。<br><br />A<br />B
幸いなことに、簡単な解決策があります。置換によって、タグの外側での一致が許可<br[^>]*>\w$
されないため、最後に出現したものを置換する必要があります。
タグ属性には文字を含めることができるため、厳密に言えば、これは HTML ではうまく機能しませんが、これは 単なる例に過ぎないと思います。>
貪欲さは後でそのように始まることはありません。これは最初<br
の文字列と一致し、残りの部分とは貪欲に一致しません。これは、を指定するため、実際には文字列の最後に移動する必要があります$
。
希望どおりに機能させるには、
/<br[^<]*?>\w$/
ただし、通常、正規表現を使用してHTMLを解析することはお勧めしません。これは、一部の属性の値に含まれる可能性があるため<
です>
。