Самый чистый способ получить числовой префикс строки
Каков самый чистый способ получить числовой префикс строки в Python?
Под "чистым" я подразумеваю простой, короткий, читаемый. Мне было все равно, о производительности, и я полагаю, что это вряд ли измеримо в Python в любом случае.
Например:
С учетом строки '123abc456def'
, какой самый чистый способ получить строку '123'
?
В приведенном ниже коде '123456'
:
input = '123abc456def'
output = ''.join(c for c in input if c in '0123456789')
Итак, я в основном искал способ заменить if
на while
.
Ответы
Ответ 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']
тоже.