Подтвердить что ты не робот

Самый чистый способ получить числовой префикс строки

Каков самый чистый способ получить числовой префикс строки в Python?

Под "чистым" я подразумеваю простой, короткий, читаемый. Мне было все равно, о производительности, и я полагаю, что это вряд ли измеримо в Python в любом случае.

Например:

С учетом строки '123abc456def', какой самый чистый способ получить строку '123'?

В приведенном ниже коде '123456':

input = '123abc456def'
output = ''.join(c for c in input if c in '0123456789')

Итак, я в основном искал способ заменить if на while.

4b9b3361

Ответ 1

Вы можете использовать itertools.takewhile, который будет перебирать вашу строку (итерируемый аргумент), пока не встретит первый элемент, который возвращает False (путем передачи в предиктор функция):

>>> from itertools import takewhile
>>> input = '123abc456def'
>>> ''.join(takewhile(str.isdigit, input))
'123'

Ответ 2

Это самый простой способ извлечь список чисел из строки:

>>> import re
>>> input = '123abc456def'
>>> re.findall('\d+', s)
['123','456']

Если вам нужен список int, вы можете использовать следующий код:

   >>> map(int, re.findall('\d+', input ))
   [123,456]

Теперь вы можете получить доступ к первому элементу [0] из приведенного выше списка

Ответ 3

Упрощенная версия (оставляя другой ответ, поскольку есть интересные дискуссии о том, какой подход лучше)

input[:-len(input.lstrip("0123456789"))]

Ответ 4

input[:len(input) - len(input.lstrip("0123456789"))]

Ответ 5

Вот мой способ:

output = input[:next((i for i,v in enumerate(input) if not v.isdigit()),None)]

Ответ 6

Один из способов, но не очень эффективный, поскольку он работает через всю строку без break:

input_string = '123abc456def'
[input_string[:c] for c in range(len(input_string)) if input_string[:c].isdigit()][-1]

Это добавляет каждую подстроку с увеличением размера, если это цифра, а затем добавляет ее. Таким образом, последний элемент - тот, который вы ищете. Поскольку это самая длинная стартовая строка, которая по-прежнему является цифрой.

Ответ 7

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

import re
initialNumber = re.match(r'(?P<number>\d+)', yourInput).group('number')

Ответ 8

Другая версия regexp удаляет все, начиная с первой цифры:

import re
output = re.sub('\D.*', '', input)

Ответ 9

input = '123abc456def'
output = re.findall(r'^\d+', input)

Вернет ['123'] тоже.