187

How can I remove digits from a string?

congusbongus
  • 13,359
  • 7
  • 71
  • 99
user1739954
  • 1,924
  • 2
  • 12
  • 6
  • 43
    With `re`: `result = re.sub(r'[0-9]+', '', s)` – Wiktor Stribiżew Sep 12 '17 at 09:42
  • with regex you will need to add \. also, as it can be decimal number i think. like result = re.sub(r'[0-9\.]+', '', s) – GurhanCagin Jan 16 '19 at 08:16
  • 6
    `"\d"` is the same in a regex as `"[0-9]"`, so you can do `result = re.sub(r"\d+", "", s)` instead. Speed will probably depend on the particular string being used, but for me, `re.sub` took about twice as long as `str.translate` (slightly longer if you don't use a pre-compiled pattern). – Nathan Jul 05 '19 at 13:24
  • @WiktorStribiżew, you answer is working fine but it is adding a new line in the file. Any reason? – Lakshmi Yadav Sep 14 '20 at 10:55
  • 2
    @LakshmiYadav `re.sub(r'[0-9]+', '', s)` **removes** found matches (see the second argument that is an empty string), it can't add anything. Check your code. – Wiktor Stribiżew Sep 14 '20 at 10:57
  • @WiktorStribiżew, I have 4 line of numeric and alphanumeric strings in a file, I am using for loop and adding your line of code. `import fileinput import re for line in fileinput.input("/Users/xyz/Desktop/temp/i_tmp.txt", inplace=True): print re.sub(r'\b[0-9\.]+','', line)` Once I run above code, numbers are vanished but after every line new line is been added. – Lakshmi Yadav Sep 14 '20 at 11:03
  • @LakshmiYadav It has nothing to do with my regex. Check your `print`. – Wiktor Stribiżew Sep 14 '20 at 11:05
  • This should instead be a duplicate of the much better-asked https://stackoverflow.com/questions/15754587. – Karl Knechtel Aug 01 '22 at 20:25

8 Answers8

276

Would this work for your situation?

>>> s = '12abcd405'
>>> result = ''.join([i for i in s if not i.isdigit()])
>>> result
'abcd'

This makes use of a list comprehension, and what is happening here is similar to this structure:

no_digits = []
# Iterate through the string, adding non-numbers to the no_digits list
for i in s:
    if not i.isdigit():
        no_digits.append(i)

# Now join all elements of the list with '', 
# which puts all of the characters together.
result = ''.join(no_digits)

As @AshwiniChaudhary and @KirkStrauser point out, you actually do not need to use the brackets in the one-liner, making the piece inside the parentheses a generator expression (more efficient than a list comprehension). Even if this doesn't fit the requirements for your assignment, it is something you should read about eventually :) :

>>> s = '12abcd405'
>>> result = ''.join(i for i in s if not i.isdigit())
>>> result
'abcd'
RocketDonkey
  • 36,383
  • 7
  • 80
  • 84
124

And, just to throw it in the mix, is the oft-forgotten str.translate which will work a lot faster than looping/regular expressions:

For Python 2:

from string import digits

s = 'abc123def456ghi789zero0'
res = s.translate(None, digits)
# 'abcdefghizero'

For Python 3:

from string import digits

s = 'abc123def456ghi789zero0'
remove_digits = str.maketrans('', '', digits)
res = s.translate(remove_digits)
# 'abcdefghizero'
Jon Clements
  • 138,671
  • 33
  • 247
  • 280
24

Not sure if your teacher allows you to use filters but...

"".join(filter(lambda x: x.isalpha(), "a1a2a3s3d4f5fg6h"))

returns-

'aaasdffgh'

Much more efficient than looping...

Example:

for i in range(10):
  a.replace(str(i),'')
Alain Nisam
  • 670
  • 4
  • 13
7

Just a few (others have suggested some of these)

Method 1:

''.join(i for i in myStr if not i.isdigit())

Method 2:

def removeDigits(s):
    answer = []
    for char in s:
        if not char.isdigit():
            answer.append(char)
    return ''.join(answer)

Method 3:

''.join(filter(lambda x: not x.isdigit(), mystr))

Method 4:

nums = set(map(int, range(10)))
''.join(i for i in mystr if i not in nums)

Method 5:

''.join(i for i in mystr if ord(i) not in range(48, 58))
inspectorG4dget
  • 110,290
  • 27
  • 149
  • 241
6

What about this:

out_string = filter(lambda c: not c.isdigit(), in_string)
Pavel Paulau
  • 786
  • 2
  • 7
  • 19
4

Say st is your unformatted string, then run

st_nodigits=''.join(i for i in st if i.isalpha())

as mentioned above. But my guess that you need something very simple so say s is your string and st_res is a string without digits, then here is your code

l = ['0','1','2','3','4','5','6','7','8','9']
st_res=""
for ch in s:
 if ch not in l:
  st_res+=ch
iddqd
  • 1,329
  • 1
  • 8
  • 9
2

I'd love to use regex to accomplish this, but since you can only use lists, loops, functions, etc..

here's what I came up with:

stringWithNumbers="I have 10 bananas for my 5 monkeys!"
stringWithoutNumbers=''.join(c if c not in map(str,range(0,10)) else "" for c in stringWithNumbers)
print(stringWithoutNumbers) #I have  bananas for my  monkeys!
Sean Johnson
  • 5,567
  • 2
  • 17
  • 22
1

If i understand your question right, one way to do is break down the string in chars and then check each char in that string using a loop whether it's a string or a number and then if string save it in a variable and then once the loop is finished, display that to the user

Baahubali
  • 4,604
  • 6
  • 33
  • 72