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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

正規表現

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

Python

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

Q&A

解決済

3回答

622閲覧

python htmlタグを含む正規表現について

Advent

総合スコア9

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

正規表現

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

Python

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

0グッド

0クリップ

投稿2020/06/09 13:10

編集2020/06/10 01:10

実現したいこと・試したこと

{'value': '<h1>Title</h1><p>このページは2020.6.9に更新されました。</p><p><small>small text</small></p><h1 class="change">2020.6.9</h1>', 'representation': 'storage', '_expandable': {'content': '/rest/api/content/127505381'}}, '_expandable': {'editor': '', 'view': '', 'export_view': '', 'styled_view': '', 'anonymous_export_view': ''}}, 'extensions': {'position': 'none'},

上のような内容のjsonオブジェクトがあり(一部を抜粋しています)、その中から

<h1 class="change">2020.6.9</h1>

の部分のみを文字列として取り出したいです。
2020.6.9 の部分は毎回異なるので、正規表現を使おうと考えました。

まずjsonオブジェクトをdumpsでstringオブジェクトに変換してprintで出力してみると、該当箇所は以下のようなテキストになっていました。

<h1>Title</h1><p>このページは2020.6.9に更新されました。</p><p><small>small text</small></p><h1 class=\"change\">2020.6.9</h1>

したがって、以下の処理を行いました。

regex = re.compile(r'<h1 class=\"change\">([0-9]+).([0-9]+).([0-9]+)</h1>') m = re.search(regex, page_string).group() print(m)

発生している問題・エラーメッセージ

以下のようなエラーが出ました。

m = re.search(regex, page_string).group() AttributeError: 'NoneType' object has no attribute 'group'

re.searchで該当箇所を見つけられなかったようで、正規表現のあたりが間違っているのかと思いいろいろと試したのですが、歯が立ちませんでした。どなたか間違いを指摘してくだされば幸いです。

補足

こちらが走査対象のpage_string全文です。

{"id": "127505381", "type": "page", "status": "current", "title": "test page", "body": {"storage": {"value": "<h1>Title</h1><p>このページは2020.6.9に更新されました。</p><p><small>small text</small></p><h1 class="change">2020.6.9</h1>", "representation": "storage", "_expandable": {"content": "/rest/api/content/127505381"}}, "_expandable": {"editor": "", "view": "", "export_view": "", "styled_view": "", "anonymous_export_view": ""}}, "extensions": {"position": "none"}, "_links": {"webui": "/display/department0056/test+page", "edit": "/pages/resumedraft.action?draftId=127505381&draftShareId=7e63c067-9cd4-4b97-8de2-88e0ffea07f5", "tinyui": "/x/5ZOZBw", "collection": "/rest/api/content", "base": "https://hogehoge.fuga.jp:8090", "context": "", "self": "https://hogehoge.fuga.jp:8090/rest/api/content/127505381"}, "_expandable": {"container": "/rest/api/space/department0056", "metadata": "", "operations": "", "children": "/rest/api/content/127505381/child", "restrictions": "/rest/api/content/127505381/restriction/byOperation", "history": "/rest/api/content/127505381/history", "ancestors": "", "version": "", "descendants": "/rest/api/content/127505381/descendant", "space": "/rest/api/space/department0056"}}

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

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

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

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

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

guest

回答3

0

regex = re.compile(r'<h1 class="change">([0-9]+).([0-9]+).([0-9]+)</h1>')
としたら成功しました。

\はメタ文字扱いらしく、.と同様に\を付ける必要があったみたいです。

投稿2020/06/10 05:43

Advent

総合スコア9

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

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

0

正規表現の部分をr'<h1 class="change">([0-9]+).([0-9]+).([0-9]+)</h1>')
としたら成功しました。

\もメタ文字扱いらしく、\の前にバックスラッシュを入れることで解決しました。

投稿2020/06/10 05:35

Advent

総合スコア9

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

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

0

ベストアンサー

正規表現は合っていますし、提示された文字列(stringオブジェクト)を直接文字列として設定するとマッチした結果を返すので、マッチした場合は正常に動作します。
おそらく、jsonオブジェクトの抜粋されていない部分に、上記の正規表現でマッチしないものが含まれていませんか? その場合、re.search(regex, page_string)Noneを返すので、group()を持っていないよ、というエラーになります。

Python

1m = re.search(regex, page_string) 2if m: 3 print(m.group())

ならエラーは起きないかと。
(m != Nonemに修正)

投稿2020/06/09 13:47

編集2020/06/09 14:23
Daregada

総合スコア11990

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

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

LouiS0616

2020/06/09 14:15

if m != None: は if m: で足りるかと。 明示的にNoneと比較したい場合は if m is not None: が望ましいです。
Daregada

2020/06/09 14:19

なるほど。C#の「?.」(Null条件演算子)みたいなのはないんですか?
Daregada

2020/06/09 14:44

いつの間にか結構な数の言語に導入されている……ありがとうございます。
Advent

2020/06/10 01:14

ご回答ありがとうございます。書いていただいたとおりにしたらエラーは出なくなったのですが、やはり希望の文字列<h1 class=\"change\">2020.6.9</h1>を取得できてないみたいです...走査対象のpage_string(string型)全文を補足に追加いたしました。正規表現にマッチするものが含まれているはずだと思うのですが...
Daregada

2020/06/10 03:31

こちらで「page_str = '提示内容を貼り付け'」したら、希望の文字列が検索されて出力されるのを確認しましたが……
Advent

2020/06/10 04:24

試していただいてありがとうございます。何か他に原因があるかもしれないので探ってみます。何度もご回答いただいてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問