これは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文字列をサポートする必要がありますが)、必要とせず、それを作るために非現実的だろうということですユニコード空間全体のすべての非数字を処理する変換テーブル。
私たちは*任意の文字列*、またはあなたの例の 'xp'変数とまったく同じように書式設定された文字列について話していますか? –
文字列は同じになります。もちろん、100%または10057/5947でもかまいません。より多くのversitaleはより良い –
'split("% ")'と 'split("/")'を使い、カッコを切り取ります。 –