正規表現の別のパターンの表記

 


import re


tag_str = "</li>"


match = re.search(r"</([a-zA-Z0-9-]+)>", tag_str)


if match:


    tag_name = match.group(1)

    print(tag_name)  # 出力: li



上記のpythonのコードで


tag_strがもう少し多くのhtmlの要素の文字列が格納されていて、


特定の要素。たとえばdiv あるいは sectionを探索したいときは


matchの変数のほうは、


match

= re.search(r"</([div])>|</([section])>|", tag_str)


というように、論理演算の時にも使用する「|」の記号を

使ってパターンを表記すればいいのでしょうか?


つまり、動的な対応のコードより、

少し、静的な方向に寄せる、ということでしょうか?


言葉の使い方が間違っているかもしれませんが・・・





正規表現で `div` や `section` など特定のタグを検索する場合、

`|` を使うのは正しいアプローチですが、書き方に誤りがあります。



### 修正後のコード:

```python

import re


tag_str = "</div> some text </section>"


# 正規表現パターン: div または section の終了タグを検索

match = re.search(r"</(div|section)>", tag_str)


if match:

    tag_name = match.group(1)

    print(tag_name)  # 出力: div(最初にマッチしたもの)

```


### 修正点:


1. `|`(論理 OR)を使うときは `()`(グループ化)を使う。


2. `[div]` や `[section]` のように `[]`(文字クラス)で囲むのは間違い。


   - `[...]` は「いずれか1文字」という意味なので、`[div]` だと `d`、`i`、

または `v` のどれか1文字とマッチするという意味になってしまう。

   - そのため `div` や `section` などの単語を探す場合は 

`(div|section)` のように書く。

   

   

3. `>|` の部分が不要。パターンとして

`|` の後に何もないとエラーになる。


### 動的な対応との違い


- `r"</(div|section)>”` のように

特定のタグだけを列挙するのは「静的」な方向に寄せると言える。



- 一方、すべてのタグを動的に抽出したい場合は

`r"</([a-zA-Z0-9-]+)>”` のような一般的な正規表現を使うので、

これは「動的」な対応と言える。


つまり、

「特定のタグだけを狙って検索する」という点で、

静的な対応に寄せたアプローチになっています。


コメント