下記の様な文字列があります。
0.0- 3.0 sec 8.75 MBytes 24.2 Mbits/sec
MBytes と Mbits/sec 間の数字だけ抽出するにはどのように記述すれば良いでしょうか。
全ての数字の値が可変となる想定のため、インデックスやスライスでは対応できず困っております。
ご存知の方いらっしゃいましたら、ご教授願います。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
スペースが常に区切りとして使われるなら、split()で分割するのが適当かと。
投稿2019/12/20 03:54
退会済みユーザー
総合スコア0
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
- 動作確認用 Repl.it: https://repl.it/@jun68ykt/Q230668
ただし、上記では、取り出したい数値を構成する文字列は、
- 小数点を1個だけ常に含む。
- 小数点の前に必ず1個以上の数字がある。
- 小数点以下に必ず1個以上の数字がある。
ことを前提にした正規表現になっているので、他の形式(24
や 1.5E3
など )もあり得るのであれば、\d+.\d+
の部分を修正する必要がありますが、見たところ単位が Mbits/sec
という通信速度なので、 (とり急ぎ)\d+.\d+
でいけるのではと思った次第です。
投稿2019/12/20 02:00
総合スコア9058
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総合スコア35668
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/20 06:46