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-]+)>”` のような一般的な正規表現を使うので、
これは「動的」な対応と言える。
つまり、
「特定のタグだけを狙って検索する」という点で、
静的な対応に寄せたアプローチになっています。
コメント
コメントを投稿