質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

2回答

285閲覧

[Python]全タグを除去する正規表現について

ebiebi5563

総合スコア16

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/01/23 10:22

##分からないこと
htmlのタグを除去したいと思い、正規表現で色々試していました。
以下のコードで目的は達成したのですが、どういう理屈で検出できたのかが分かりません。

<.+> = <>に挟まれる文字が一回以上続く場合

だと思うのですが、 ? はどうして付くのでしょうか。

##コード

python

1pattern = '<.+?>' 2 3replace = "" 4 5html = """ 6 <!DOCTYPE html> 7 <html lang="ja"> 8 <head> 9 <meta charset="utf-8"> 10 <title>タイトル</title> 11 </head> 12 <body> 13 <div class="wrapper"> 14 <header> 15 <h1>メインタイトル</h1> 16 <nav id="global-nav"> 17 <ul> 18 <li>リンク1</li> 19 <li>リンク2</li> 20 <li>リンク3</li> 21 <li>リンク4</li> 22 <li>リンク5</li> 23 </ul> 24 </nav> 25 </header> 26 <div class="main-contents"> 27 <h2>見出し</h2> 28 <p>テキストテキストテキスト</p> 29 </div> 30 </div> 31 </body> 32 </html> 33 """ 34 35result = re.sub(pattern, replace, html) 36 37print(result)

何卒、ご回答の程よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Pythonのドキュメントに、ほとんどそのまま理由が書いてあります。

######*?, +?, ??

'' 、 '+' 、 '?' といった修飾子は、すべて 貪欲 (greedy) マッチ、すなわちできるだけ多くのテキストにマッチするようになっています。時にはこの動作が望ましくない場合もあります。例えば正規表現 <.> を '<a> b <c>' にマッチさせると、 '<a>' だけにマッチするのではなく全文字列にマッチしてしまいます。 ? を修飾子の後に追加すると、 非貪欲 (non-greedy) あるいは 最小一致 (minimal) のマッチになり、できるだけ 少ない 文字数のマッチになります。例えば正規表現 <.*?> を使うと '<a>' だけにマッチします。

引用元: Python 標準ライブラリ » re — 正規表現操作

投稿2019/01/23 11:17

LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

? はどうして付くのでしょうか。

+?で1セットで、最短一致、つまり、「次にある>より手前の繰り返し」という意味になります。

1文字だけなら、最短一致を使わなくても、<[^>]+>、つまり「>以外を繰り返す」という手段もあります。

投稿2019/01/23 10:26

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/23 12:01

まあ実は 質問者のもこれもだけど <a onclick="alert( 1 > 2 )"; >test</a> みたいなのでタグが面白い具合に壊れるんだよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問