🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

4回答

527閲覧

[Python3] 指定文字列の抽出に関して

3265462164

総合スコア67

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/12/20 01:38

下記の様な文字列があります。

0.0- 3.0 sec 8.75 MBytes 24.2 Mbits/sec

MBytesMbits/sec 間の数字だけ抽出するにはどのように記述すれば良いでしょうか。
全ての数字の値が可変となる想定のため、インデックスやスライスでは対応できず困っております。

ご存知の方いらっしゃいましたら、ご教授願います。

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

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

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

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

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

guest

回答4

0

スペースが常に区切りとして使われるなら、split()で分割するのが適当かと。

投稿2019/12/20 03:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

3265462164

2019/12/20 06:46

te2jiさん、ありがとうございます。 もうベストアンサーを決めてしまったので操作が出来ませんが、 そのようなやり方もあるのですね。 調べてみます。 情報ありがとうございました。
guest

0

ベストアンサー

こんにちは

正規表現を使って以下でいかがでしょうか?

python3

1import re 2 3text = '0.0- 3.0 sec 8.75 MBytes 24.2 Mbits/sec' 4 5m = re.search(r'MBytes\s+(\d+.\d+)\s+Mbits/sec', text) 6 7if m: 8 x = float(m.group(1)) 9 print(x) # => 24.2 10

ただし、上記では、取り出したい数値を構成する文字列は、

  • 小数点を1個だけ常に含む。
  • 小数点の前に必ず1個以上の数字がある。
  • 小数点以下に必ず1個以上の数字がある。

ことを前提にした正規表現になっているので、他の形式(241.5E3 など )もあり得るのであれば、\d+.\d+ の部分を修正する必要がありますが、見たところ単位が Mbits/sec という通信速度なので、 (とり急ぎ)\d+.\d+ でいけるのではと思った次第です。

投稿2019/12/20 02:00

jun68ykt

総合スコア9058

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

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

3265462164

2019/12/20 03:45

jun68yktさん、ありがとうございました。 私には少し難しいのですが、教えていただいた正規表現で記述してみようと思います。 どうもありがとうござました!
jun68ykt

2019/12/20 04:37

どういたしまして。参考になれば幸いです。
guest

0

正規表現で。

Python

1>>> import re 2>>> 3>>> src = '0.0- 3.0 sec 8.75 MBytes 24.2 Mbits/sec' 4>>> dst = re.search(r'MBytes +([0-9.]+) +Mbits', src).group(1) 5>>> 6>>> print(type(dst), dst) 7<class 'str'> 24.2

指数表記 (2.42e+1) にも対応するなら、[0-9.]+ の代わりに [0-9.e+-]+ を使えば良いです。

この場合 1+2-3 とかにもマッチしてしまうので、数値の妥当性は別途確認する必要があります。
簡単には float 関数に文字列を食わせたときの例外の有無で判断すれば良いでしょう。

投稿2019/12/20 01:51

編集2019/12/20 02:04
LouiS0616

総合スコア35668

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

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

3265462164

2019/12/20 03:44

LouiS0616さん、ありがとうございました。 正規表現、参考になりました。
guest

0

... インデックスやスライスでは対応できず ...

文字列を適切な文字で split すれば、単語の配列にできます。

bash

1$ poython3 2>>> s = "0.0- 3.0 sec 8.75 MBytes 24.2 Mbits/sec" 3>>> s 4'0.0- 3.0 sec 8.75 MBytes 24.2 Mbits/sec' 5>>> words = s.split(" ") 6>>> words 7['0.0-', '3.0', 'sec', '', '8.75', 'MBytes', '', '24.2', 'Mbits/sec'] 8>>> 9~~~ 10 11求める数字列が何番目の単語かが決まっているなら, その単語をとりっだしてから、float() で数字として取り出せます。 12今の場合だと、 "Mbits/sec" を探して、その一つ前の単語をとりだしてから float() しても良さそうです。

投稿2019/12/21 23:19

katoy

総合スコア22324

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

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

3265462164

2019/12/24 04:56

katoyさん、ありがとうございます。 色々な記述方法があるのですね。 splitにての単語の配列、参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問