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

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

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

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

Python

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

Q&A

解決済

1回答

530閲覧

Pythonで非整形されたURLを正規表現で抽出したい

sakana100

総合スコア4

正規表現

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

Python

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

0グッド

0クリップ

投稿2021/10/04 07:18

#やりたいことの概要

現在、Wikiの移行作業を行っております。
その中で、HTMLで記載された文章をPythonのHTML2TEXTというライブラリを使って、変換した結果、以下のようなURLを吐き出す場合が発生しました。

正常な状態
テキストテキストの続き

吐き出された状態パターン1

[テキスト
テキストの続き](https://test.com/te
st1/test2/test3/
test4/test5)

吐き出された状態パターン2

[https://test.com/te
st1/test2/test3/
test4/test5](https://test.com/te
st1/test2/test3/
test4/test5)

全記事の中から上記の異常な箇所を抜き出し、正しく直したものに置換し、再投稿(更新)をかけたいと思っております。

大雑把に、
1.全記事を取得し、本文を抽出する
2.上記異常な箇所をre.findallを使って抽出する
3.異常箇所を置換して修正する
4.修正後の本文を再投稿(更新)する

という工程での作業を想定しています。

叶えたいこと

上記吐き出された状態パターン1,2それぞれからURLを(https://test.com/test1/test2/test3/test4/test5)の状態で取得したい。

# 問題が起きていること
2. 上記異常な箇所をre.findallを使って抽出する
において、対象のURLの抽出に困っております。
以下のコードで抽出を行っておりますが、こちらで実行すると、記事全文が取得されてしまいます。

  • urls = re.findall(r'[([]https://[\S\s]*[)]]',body)

検索の末尾を\nにしてしまうと、1行しか検索されずに、正しいURLの取得をすることができておりません。
もちろん、上記の方法で抽出しても、さらに整形する必要があるのは承知しております。

よろしくお願いいたします。

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

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

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

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

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

etherbeg

2021/10/04 09:08

html2text自体は年季の入ったプログラムなのに、そういった不具合と思われる挙動が残っているのはおかしいですね。意図しない改行が行われる箇所に何かパターンのようなものはないのでしょうか。
guest

回答1

0

ベストアンサー

抽出は以下で出来ます。

python

1re.findall(r'[[^]]+]([^)]+)', text, flags=re.MULTILINE | re.DOTALL)

実行例

python

1>>> text = '[テキスト\nテキストの続き](https://test.com/te\nst1/test2/test3/\ntest4/test5)XYZ\nAAA\n[https://test.com/te\nst1/test2/test3/\ntest4/test5](https://test.com/te\nst1/test2/test3/\ntest4/test5)DEF\n12345' 2>>> print(text) 3[テキスト 4テキストの続き](https://test.com/te 5st1/test2/test3/ 6test4/test5)XYZ 7AAA 8[https://test.com/te 9st1/test2/test3/ 10test4/test5](https://test.com/te 11st1/test2/test3/ 12test4/test5)DEF 1312345 14>>> re.findall(r'[[^]]+]([^)]+)', text, flags=re.MULTILINE | re.DOTALL) 15['[テキスト\nテキストの続き](https://test.com/te\nst1/test2/test3/\ntest4/test5)', '[https://test.com/te\nst1/test2/test3/\ntest4/test5](https://test.com/te\nst1/test2/test3/\ntest4/test5)'] 16

投稿2021/10/04 08:23

ppaul

総合スコア24666

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問