5

私が作成しようとしているこのプログラムでは、式 (「I=23mm」または「H=4V」など) があり、それから 23 (または 4) を抽出しようとしています。それを整数にします。

私が遭遇し続ける問題は、数字を取り出そうとしている式が 1 つの単語であるため、split() などを使用できないことです。

私が見たがうまくいかなかった一例は -

I="I=2.7A"
[int(s) for s in I.split() if s.isdigit()]

数字がスペースで区切られているだけなので、これは機能しません。int078vert という単語に数値が含まれていた場合、それは抽出されません。また、私のものには区切るスペースがありません。

こんな感じのものを作ってみましたが、

re.findall("\d+.\d+", "Amps= 1.4 I")

しかし、渡される番号が常に2桁であるとは限らないため、どちらも機能しませんでした。それは 5 のようなものかもしれませんし、13.6 のようなものかもしれません。

次のような文字列を渡す場合、どのコードを書く必要がありますか?

I="I=2.4A"

また

I="A=3V"

この文字列から数字だけを抽出できるようにするには?(そしてそれに対して操作を行います)?区切ることができるスペースやその他の定数文字はありません。

4

2 に答える 2

13
>>> import re
>>> I = "I=2.7A"
>>> s = re.search(r"\d+(\.\d+)?", I)
>>> s.group(0)
'2.7'
>>> I = "A=3V"
>>> s = re.search(r"\d+(\.\d+)?", I)
>>> s.group(0)
'3'
>>> I = "I=2.723A"
>>> s = re.search(r"\d+(\.\d+)?", I)
>>> s.group(0)
'2.723'
于 2012-04-05T23:19:52.977 に答える
3

RE はおそらくこれに適していますが、1 つの RE 回答が既に投稿されているため、非正規表現の例を取り上げて変更します。


One example I saw but wouldnt work was - 

I="I=2.7A"
[int(s) for s in I.split() if s.isdigit()]

良いことは、split()引数を取ることができるということです。これを試して:

extracted = float("".join(i for i in I.split("=")[1] if i.isdigit() or i == "."))

ちなみに、あなたが提供したREの内訳は次のとおりです。

"\d+.\d+"
\d+ #match one or more decimal digits
. #match any character -- a lone period is just a wildcard
\d+ #match one or more decimal digits again

それを(正しく)行う1つの方法は次のとおりです。

"\d+\.?\d*"
\d+ #match one or more decimal digits
\.? #match 0 or 1 periods (notice how I escaped the period)
\d* #match 0 or more decimal digits
于 2012-04-06T00:38:48.757 に答える