6

コード:

str = '<br><br />A<br />B'
print(re.sub(r'<br.*?>\w$', '', str))

<br><br />A返されるはずですが、空の文字列が返されます''

なにか提案を?

4

2 に答える 2

7

貪欲は左から右に作用しますが、それ以外では作用しません。これは基本的に「一致に失敗しない限り、一致しない」という意味です。何が起こっているかは次のとおりです。

  1. 正規表現エンジン<brは、文字列の先頭で一致します。
  2. .*?今のところ無視されます。怠惰です。
  3. と一致させよう>とすると、成功します。
  4. 一致しようとして\w失敗します。興味深いことに、エンジンはバックトラックを開始し、.*?ルールを確認します。この場合、.は最初の に一致する可能性が>あるため、その一致にはまだ希望があります。
  5. これは、正規表現がスラッシュに到達するまで発生し続けます。その後>\w、一致できますが、$失敗します。繰り返しますが、エンジンは遅延ルールに戻り、.*一致するまで一致を続けます。<br><br />A<br />B

幸いなことに、簡単な解決策があります。置換によって、タグの外側での一致が許可<br[^>]*>\w$されないため、最後に出現したものを置換する必要があります。 タグ属性には文字を含めることができるため、厳密に言えば、これは HTML ではうまく機能しませんが、これは 単なる例に過ぎないと思います。
>

于 2010-11-25T05:57:40.853 に答える
1

貪欲さは後でそのように始まることはありません。これは最初<brの文字列と一致し、残りの部分とは貪欲に一致しません。これは、を指定するため、実際には文字列の最後に移動する必要があります$

希望どおりに機能させるには、

/<br[^<]*?>\w$/

ただし、通常、正規表現を使用してHTMLを解析することはお勧めしません。これは、一部の属性の値に含まれる可能性があるため<です>

于 2010-11-25T05:56:51.797 に答える