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

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

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

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

Python

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

Q&A

解決済

1回答

1905閲覧

Pythonの正規表現で通貨の換算をしたい

presente

総合スコア8

正規表現

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

Python

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

1グッド

2クリップ

投稿2020/04/28 11:05

お世話になっております。Pythonの正規表現を用いてテキスト中の数値を計算したものに置き換えたいと思います。例えば次のようなテストコードを通るようにするのが目的です。

def test_convert_dollars_into_yen(self): rate = 106.73 text = "原油先物6月限は3.5%高の1バレル=17.07ドル。ニューヨーク時間20日の取引では、5月限が一時マイナス40.32ドルを付けていた" expected = "原油先物6月限は3.5%高の1バレル=1821円。ニューヨーク時間20日の取引では、5月限が一時マイナス4303円を付けていた" converted = convert_dollars_into_yen(text, rate) self.assertEqual(expected, converted) def test_convert_dollars_into_yen2(self): rate = 106.73 text = "トランプ米政権と議会指導部は20日、4500億ドル規模の追加の新型コロナウイルス対策を発動する方向で最終調整に入った" expected = "トランプ米政権と議会指導部は20日、48028500000000円規模の追加の新型コロナウイルス対策を発動する方向で最終調整に入った" converted = convert_dollars_into_yen(text, rate) self.assertEqual(expected, converted)

細かい要件は

  • 為替レートが1ドル106.73円としてテストを書いています。レートは引数で与えることができます。
  • 入力は新聞記事などの普通の日本語です。UnicodeのNFKC正規化や余分なスペースの除去などの前処理は済んでいるものと考えてください。
  • テキストの中に何箇所ドル表記があるかは決まっていません。0箇所かも知れませんし、複数あるかも知れません。
  • ドル表記は「半角数字ドル」です。整数とは限らず小数もありえます。「$30」のような表記は事前に「30ドル」に正規化されます。
  • 「億ドル」のような表記も計算したいと思いますが、疑問点は上記のものと同じです(複数箇所を抜き出して計算して元の位置を置き換えられればこれも実現可能)

やったこと

  • re.sub()による置換 => 数値計算ができない
  • match.group()による計算 => ドル表記がいくつあるかわからない場合に使えない

正規表現なのでバージョンはいくつでもよいと思いますが、環境はPython 3.7とさせてください。

よろしくお願いします。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

re.subには置換関数を与えることもできますから、これを利用すれば良いでしょう。

Python

1import re 2 3def plus_one(m): 4 n = int(m.group(0)) 5 return str(n+1) 6 7src = '1富士2鷹3なすび' 8dst = re.sub(r'\d+', plus_one, src) 9print(dst)

実行結果 Wandbox

2富士3鷹4なすび

参考re --- 正規表現操作 — Python 3.8.2 ドキュメント

投稿2020/04/28 11:29

編集2020/04/28 11:31
LouiS0616

総合スコア35668

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

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

LouiS0616

2020/04/28 11:32 編集

プロフィールを拝見しましたが、未解決のまま長期間放置している質問があるようです。 解決したのなら解決済みにして下さい。解決していないのであれば、せめてコメントを入れるなどして『なぜその回答では解決しないのか』伝えるべきでしょう。
presente

2020/04/29 00:27

大変申し訳ありません。2年前のものですので詳しい状況を覚えていませんが、コメントしたつもりでいて、しばらくログインしなかったものと思います。 また今回の回答ありがとうございました。無事に動作いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問