2009-08-08 81 views

回答

153
>>> import re 
>>> re.sub("[^0-9]", "", "sdkjh987978asd098as0980a98sd") 
'987978098098098' 
+61

可能是re.sub(r「\ D」,「」,「sdkjh987978asd098as0980a98sd」) – newacct 2009-08-08 19:07:25

59

不知道這是最有效的方式,但是:

>>> ''.join(c for c in "abc123def456" if c.isdigit()) 
'123456' 

''.join部分是指所有的結果字符之間沒有任何字符相結合。然後剩下的就是一個列表理解,其中(正如你可能猜到的那樣),我們只取得匹配條件isdigit的字符串部分。

+1

那請問相反。我認爲你的意思是「不是c.isdigit()」 – 2009-08-08 17:19:51

+7

刪除所有非數字==只保留數字。 – 2009-08-08 17:21:43

+7

我喜歡這種方法不需要重新引入這個簡單的函數。 – triunenature 2015-05-25 03:09:22

4

最快的方法,如果您需要執行不僅僅是一個或兩個這樣的刪除操作更多(甚至只是一個,而是在一個很長的字符串 - !),是依靠字符串的translate方法,即使它確實需要一些準備:

>>> import string 
>>> allchars = ''.join(chr(i) for i in xrange(256)) 
>>> identity = string.maketrans('', '') 
>>> nondigits = allchars.translate(identity, string.digits) 
>>> s = 'abc123def456' 
>>> s.translate(identity, nondigits) 
'123456' 

translate方法是不同的,也許一點點簡單的易於使用,對Unicode字符串比它的字節串,順便說一句:

>>> unondig = dict.fromkeys(xrange(65536)) 
>>> for x in string.digits: del unondig[ord(x)] 
... 
>>> s = u'abc123def456' 
>>> s.translate(unondig) 
u'123456' 

您可能想要使用映射類而不是實際的字典,尤其是如果您的Unicode字符串可能包含具有非常高的ord值的字符(這會使字典過大;-)。例如:

>>> class keeponly(object): 
... def __init__(self, keep): 
...  self.keep = set(ord(c) for c in keep) 
... def __getitem__(self, key): 
...  if key in self.keep: 
...  return key 
...  return None 
... 
>>> s.translate(keeponly(string.digits)) 
u'123456' 
>>> 
+1

(1)不要硬編碼幻數; S/65536/SYS。maxunicode /(2)該字典無條件地「過大」,因爲輸入「可能」包含'(sys.maxunicode - number_of_non_numeric_chars)'條目。 (3)考慮string.digits是否足以導致需要破解unicodedata模塊(4)爲簡單起見,考慮re.sub(r'(?u)\ D +',u'',text)速度。 – 2009-08-08 23:31:19

12

這應該字符串和Unicode對象工作:

# python <3.0 
def only_numerics(seq): 
    return filter(type(seq).isdigit, seq) 

# python ≥3.0 
def only_numerics(seq): 
    seq_type= type(seq) 
    return seq_type().join(filter(seq_type.isdigit, seq)) 
+0

,只有在Python 2.x – SilentGhost 2009-09-07 09:09:49

+1

謝謝你的提醒,SilentGhost。 – tzot 2009-09-08 01:02:57

+1

你有一個反斜槓,但是SO不會讓我修復它。 – 2013-05-25 23:01:12

4

只是另一種選擇加進來,還有string模塊內的幾個有用的常量。雖然在其他情況下更有用,但可以在這裏使用它們。

>>> from string import digits 
>>> ''.join(c for c in "abc123def456" if c in digits) 
'123456' 

有幾種常量模塊中,包括:

  • ascii_letters(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ)
  • hexdigits(abcdefABCDEF)

如果您大量使用這些常量,它可以值得將它們轉換爲frozenset。這使O(1)查找,而不是O(n),其中n是原始字符串的常量的長度。

>>> digits = frozenset(digits) 
>>> ''.join(c for c in "abc123def456" if c in digits) 
'123456' 
+0

''.join(c爲c中的「abc123def456」,如果c.isdigit())在我的Python 3.4 – 2016-02-14 00:11:29

-6
user = (input): 
print ("hello") 
相關問題