2016-09-07 47 views
0

文字列(3番目の文字列)からいくつかの整数を取得したいと考えています。正規表現を使用しないで望ましい。正規表現を使用せずに文字列から整数を取得する最良の方法

私は多くのものを見ました。

私の文字列:

xp = '93% (9774/10500)' 

は、だから私は、文字列から整数のリストを返すようにコードをしたいと思います。だから、所望の出力は次のようになります。[93, 9774, 10500]

このようないくつかのものは動作しません:

>>> new = [int(s) for s in xp.split() if s.isdigit()] 
>>> print new 
[] 
>>> int(filter(str.isdigit, xp)) 
93977410500 
+0

私たちは*任意の文字列*、またはあなたの例の 'xp'変数とまったく同じように書式設定された文字列について話していますか? –

+0

文字列は同じになります。もちろん、100%または10057/5947でもかまいません。より多くのversitaleはより良い –

+0

'split("% ")'と 'split("/")'を使い、カッコを切り取ります。 –

答えて

7

、ワンライナーは次のようになり:フォーマットはを固定されている

xp = '93% (9774/10500)' 
''.join([ x if x.isdigit() else ' ' for x in xp ]).split() # ['93', '9774', '10500'] 
+2

リストを削除して( '' '' '' '))ジェネレータ式を' join() 'に直接渡すこともできます。 –

+0

実際にはエレガントです –

+0

スマートでエレガントな –

1

を数字でフィルタ、その後、非数字で文字列を分割するために正規表現(!申し訳ありません)を使用(することができます空のフィールドを持つ)、intに変換します。

import re 

xp = '93% (9774/10500)' 

print([int(x) for x in filter(str.isdigit,re.split("\D+",xp))]) 

結果:問題は、あなたが、あなたが最初のスペース、その後の分割により、数字ではありませんすべてを置き換えることができます別の文字に分割する必要があるので

[93, 9774, 10500] 
+0

\ D + –

+0

'\ D'は任意の非数字文字ですが、' + 'は1つ以上を意味します。昨日 '\ D'を学んだのは – L3viathan

+0

です。私はちょうど1日前にあなたでした:)編集されました。 –

-1

ので、あなたがsplit()の連続を使用することができます。 それは非常にきれいな、または一般的ではないのですが、時には直接および「愚かな」解決策はそれほど悪くないです。

a, b = xp.split("%") 
x = int(a) 
y = int(b.split("/")[0].strip()[1:]) 
z = int(b.split("/")[1].strip()[:-1]) 
print(x, y, z) # prints "93 9774 10500" 

編集:明確化のポスターは、特に彼の形式は固定であることを言いました。この解決策はそれほど美しいものではありませんが、それは想定されていることを実行します。

1

これはPy2なので、strを使用すると、完全なUnicode範囲を考慮する必要はないようです。何度もこの多くのをやっているので、あなたは少しstr.translateを使用してpolku's answerに向上させることができます

# Create a translation table once, up front, that replaces non-digits with 
import string 
nondigits = ''.join(c for c in map(chr, range(256)) if not c.isdigit()) 
nondigit_to_space_table = string.maketrans(nondigits, ' ' * len(nondigits)) 

# Then, when you need to extract integers use the table to efficiently translate 
# at C layer in a single function call: 
xp = '93% (9774/10500)' 
intstrs = xp.translate(nondigit_to_space_table).split() # ['93', '9774', 10500] 

myints = map(int, intstrs) # Wrap in `list` constructor on Py3 

性能面では、私の64ビットLinux 2.7、ビルドのテスト文字列のため、translateを使用して実行するのに約374ナノ秒かかります、リストコンプは2.76マイクロ秒、ソリューションはjoinです。 listcomp + joinは> 7倍長くなります。より大きな文字列(固定オーバーヘッドが実際の作業と比較して些細な場合)では、listcomp + join解決方法は20倍近く長くなります。

polkuのソリューションへの主な利点は、それがstr.translateが別の方法(str.translate)変換テーブルを構築しますPY3には何の変化(その上で、それがシームレスに非ASCII文字列をサポートする必要がありますが)、必要とせず、それを作るために非現実的だろうということですユニコード空間全体のすべての非数字を処理する変換テーブル。

関連する問題