Вырезать числа из строки - программирование
Подтвердить что ты не робот

Вырезать числа из строки

У нас есть куча строк, например: c1309, IF1306, v1309, p1209, a1309, mo1309.
В Python, какой лучший способ лишить номера? Все, что мне нужно: c, IF, v, p, a, mo из приведенного выше примера.

4b9b3361

Ответ 1

Вы можете использовать regex:

>>> import re
>>> strs = "c1309, IF1306, v1309, p1209, a1309, mo1309"
>>> re.sub(r'\d','',strs)
'c, IF, v, p, a, mo'

или более быстрая версия:

>>> re.sub(r'\d+','',strs)
'c, IF, v, p, a, mo'

timeit сравнения:

>>> strs = "c1309, IF1306, v1309, p1209, a1309, mo1309"*10**5

>>> %timeit re.sub(r'\d','',strs)
1 loops, best of 3: 1.23 s per loop

>>> %timeit re.sub(r'\d+','',strs)
1 loops, best of 3: 480 ms per loop

>>> %timeit ''.join([c for c in strs if not c.isdigit()])
1 loops, best of 3: 1.07 s per loop

#winner
>>> %timeit from string import digits;strs.translate(None, digits)
10 loops, best of 3: 20.4 ms per loop

Ответ 2

>>> text = 'mo1309'
>>> ''.join([c for c in text if not c.isdigit()])
'mo'

Это быстрее, чем регулярное выражение

python -m timeit -s "import re; text = 'mo1309'" "re.sub(r'\d','',text)"
100000 loops, best of 3: 3.99 usec per loop
python -m timeit -s "import re; text = 'mo1309'" "''.join([c for c in text if not c.isdigit()])"
1000000 loops, best of 3: 1.42 usec per loop
python -m timeit -s "from string import digits; text = 'mo1309'" "text.translate(None, digits)"
1000000 loops, best of 3: 0.42 usec per loop

но str.translate, как предложено @DavidSousa:

from string import digits
text.translate(None, digits)

всегда самый быстрый в снятии символов.

Также itertools предоставляет малоизвестную функцию под названием ifilterfalse

>>> from itertools import ifilterfalse
>>> ''.join(ifilterfalse(str.isdigit, text))
'mo'

Ответ 3

Я думаю, что строковый метод translate более элегантный, чем объединение списков и т.д.

from string import digits # digits = '0123456789'
list1 = ['c1309', 'IF1306', 'v1309', 'p1209', 'a1309', 'mo1309']
list2 = [ i.translate(None, digits) for i in list1 ]

Ответ 4

Я думаю, что это самый простой, и, вероятно, он будет самым быстрым.

>>> import string
>>> s = 'c1309, IF1306, v1309, p1209, a1309, mo1309'
>>> s.translate(None, string.digits)
'c, IF, v, p, a, mo'

Примечание: интерфейс str.translate был изменен для использования сопоставления в python3, так что вот 3 версия

s.translate({ord(n): None for n in string.digits})

Или более явная альтернатива:

m = str.maketrans('', '', string.digits)
s.translate(m)

Ответ 5

strings = ['c1309', 'IF1306', 'v1309', 'p1209', 'a1309', 'mo1309']
stripped = [''.join(c for c in s if not c.isdigit()) for s in strings]

Ответ 6

Если все строки, с которыми вы работаете, заканчиваетесь номером, вы можете буквально strip номер:

>>> strings = ['c1309', 'IF1306', 'v1309', 'p1209', 'a1309', 'mo1309']
>>> [s.strip("0123456789") for s in strings]
['c', 'IF', 'v', 'p', 'a', 'mo']

Если вы хотите удалить цифры только в конце строки, используйте rstrip. Если цифры могут появляться внутри строки, этот метод вообще не работает.

Ответ 7

использовать нотацию фрагмента, если длина номера фиксирована и позиция не находится в середине строки.

NUM_LEN = 4
stringsWithDigit = ["ab1234", "cde1234", "fgh5678"]
for i in stringsWithDigit:
   print i[:-NUM_LEN]

любая вещь

import re
c = re.compile("[^0-9]+")
print c.findall("".join(stringsWithDigit))

Ответ 8

Вы можете попробовать это регулярное выражение:

^[a-zA-Z]+

Он будет просто брать последовательные алфавиты from start и пренебрегать всем остальным материалом в строке.

Никакой замены не потребуется.