正規表現_html_終了タグにマッチ

 


pythonで正規表現を使って文字列操作をするときに、


html要素のうちの終了タグを探索したいときの

その終了タグを表すパターン文字列は


pattern_tag_close = r"</([a-zA-Z0-9-]+)>"


でよろしいでしょうか?



`pattern_tag_close = r"</([a-zA-Z0-9-]+)>"` でも


基本的に動作しますが、以下の点で改善の余地があります。


### 改善点:

1. **HTMLのタグ名には数字が先頭に来ない** 

 

   → `[a-zA-Z0-9-]+` では先頭が数字でもマッチしてしまう。

HTMLではタグ名は英字で始まるので 

`[a-zA-Z][a-zA-Z0-9-]*` の方が適切。


2. **自己終了タグの考慮は不要** 

 

   → `</tag>` のような終了タグのみを対象にするので問題なし。


3. **改行や空白の考慮

(特に `< /tag>` のような異常なスペースの考慮)**

  

   → `\s*` を追加すると、`</ tag>` のような

異常な空白にも対応可能。



### 修正後の正規表現:


```python


pattern_tag_close

 = r"</\s*([a-zA-Z][a-zA-Z0-9-]*)\s*>"


```


### 解説:


- `</\s*` → `</` の後にスペース(`\s*`)があってもOK


- `([a-zA-Z][a-zA-Z0-9-]*)`

→ タグ名の先頭は英字、後続は英数字とハイフン


- `\s*>` → タグ名の後にもスペースがあってもOK



### 使用例:


```python


import re


pattern_tag_close

= r"</\s*([a-zA-Z][a-zA-Z0-9-]*)\s*>"


html = "<div>Content</div> <br/> </span> </ div>"


matches = re.findall(pattern_tag_close, html)


print(matches)  # ['div', 'span', 'div']


```


`</span>` や `</ div>` のような

異常な空白を含むタグも正しくマッチできます。


コメント