7

「12454v」、「346346z」などの文字列があります。文字列からすべての文字を削除したい。

Re は正常に動作します:

import re
str='12454v'
re.sub('[^0-9]','', str)

#return '12454'

正規表現を使わずにこれを行う方法はありますか?

4

4 に答える 4

9
>>> ''.join(filter(str.isdigit, '12454v'))
'12454'
于 2013-02-07T12:08:22.197 に答える
4

Python 2では、translateメソッドの2番目の引数を使用して、削除する文字を指定できます

http://docs.python.org/2/library/stdtypes.html#str.translate

与えられた例は、文字を削除するNoneための変換テーブルとして使用できることを示しています。

>>> 'read this short text'.translate(None, 'aeiou')
'rd ths shrt txt'

(文字列モジュールからすべてのASCII文字のリストを次のように取得できますstring.letters。)

更新:Python 3にもtranslateメソッドがありますが、少し異なる設定が必要です。

from string import ascii_letters
tr_table = str.maketrans({c:None for c in ascii_letters})
'12345v'.transate(tr_table)

ちなみに、Python 2で変換テーブルを使用する方が、join/filterメソッドよりもはるかに高速です。

>>> timeit("''.join(filter(lambda c:not c.isalpha(), '12454v'))")
2.698641061782837
>>> timeit("''.join(filter(str.isdigit, '12454v'))") 
1.9351119995117188
>>> timeit("'12454v'.translate(None, string.letters)", "import string")
0.38182711601257324

同様にPython3でも。

>>> timeit("'12454v'.translate(tr_table)", "import string; tr_table=str.maketrans({c:None for c in string.ascii_letters})")
0.6507143080000333
>>> timeit("''.join(filter(lambda c:not c.isalpha(), '12454v'))")
2.436105844999929
于 2013-02-07T12:07:17.257 に答える
2

メソッドでこれを試すことができると思います.translate

>>> import string
>>> str='12454v'
>>> str.translate(None, string.letters)
'12454'

.translateメソッドhereについて非常に良い答えがあります。

于 2013-02-07T12:09:43.687 に答える
1

これは、特定の関数を使用しておらず、やや不格好であるため、他のものよりもややエレガントではありません。

newStr = ''
myStr='12454v'
for char in myStr:
    try:
        newStr += str(int(char))
    except ValueError:
        pass
print newStr

繰り返しますが、これは最善の方法ではありませんが、私はそれを捨てています。intが整数かどうかを確認できるように、最初に変換しました。次に、 にstr追加できるように に変換しnewStrます。

別の注意strとして、組み込み関数をシャドウするため、変数名として使用しないでくださいstr()

于 2013-02-07T13:28:02.510 に答える