まず、別の正規表現が必要になります。あなたが持っているものは、最初の「<」と最後の「>」の間のすべてを選択しますしたがって、文字列:
I can type in <b>BOLD</b>
マッチをレンダリングします:
大胆な
これを修正する方法は、怠惰な演算子を使用することです。このサイトには、なぜ使用する必要があるかについての良い説明があります
<.+?>
HTML タグに一致します。そして最終的には、次のように置き換える必要があります。
re.sub(r'', '', 行)
ただし、実際に一致させたいのはタグの間だと思います。ここで、先見の明が驚くべき結果をもたらすことができます。
(?<=>).+?(?=<)
クレイジーに見えますが、かなり簡単に壊れます。あなたが知っていることから始めましょう:
.+?
任意の長さの文字列に一致します。? 可能な限り短い文字列に一致することを意味します。(前に追加した怠惰)
(<?=...)
後読みです。表情を捉えずに、文字通り自分の後ろを向いています。
(?=...)
先読みです。後読みと同じです。次に、少し findall を使用します。
re.findall(r'(?<=>).+?(?=<)', line);
これで、配列を繰り返し処理し、取り残された不要なスペースを削除して、非常に優れた出力を作成できます。または、本当に置換メソッドを使用したい場合 (私は知っています):
re.sub(r'\s*(?:</+?>\s*)+', ' ', line)
の
\s*
は、タグに添付された任意の量の空白と一致します。これを 1 つのスペースに置き換えることができます。これにより、慎重にタグを付けすぎるとしばしば発生する不安なダブル スペースやトリプル スペースが削減されます。おまけとして、
(?: ... )
は、非キャプチャ グループとして知られています (結果に小さいサブ マッチは表示されません)。この状況では、実際には必要ありませんが、グループは常に考えるのに役立つものであり、必要なものだけをキャプチャすることをお勧めします。その末尾に + を追加すると (私が行ったように)、隣接するタグと同じ数のタグがキャプチャされ、それらが 1 つのスペースに取り除かれます。したがって、ファイルに
This is <b> <i> overemphasized </b> </i>!
あなたが得るだろう
This is overemphasized !
それ以外の
This is overemphasized !