Проверьте строку для чисел в Python - PullRequest
5 голосов
/ 04 августа 2011

Как проверить, содержит ли строка числа в Python?

У меня есть переменная, которую я конвертирую в float, но я хочу сделать оператор if, чтобы преобразовать его в float, только если он содержит только числа.

Ответы [ 5 ]

10 голосов
/ 04 августа 2011

Просто конвертируйте его и перехватывайте исключение, если оно не работает.

s = "3.14"
try:
  val = float(s)
except ValueError:
  val = None
3 голосов
/ 04 августа 2011

Я бы использовал блок try-exc для определения, является ли это число.Таким образом, если s является числом, приведение выполнено успешно, а если нет, вы перехватываете ValueError, чтобы ваша программа не ломалась.

def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False
2 голосов
/ 01 марта 2013

Почему бы не встроенный .isdigit() для этого. Компактный, без try операторов и супер быстрый:

string = float(string) if string.isdigit() else string

Рассматривая обработку ошибок в Python, я полагаю, что мастер Йода сказал: «Нет попытки. Делай или не делай».

2 голосов
/ 04 августа 2011

Вы также можете извлечь числа из строки.

import string
extract_digits = lambda x: "".join(char for char in x if char in string.digits + ".")

и затем преобразовать их в число с плавающей точкой.

to_float = lambda x: float(x) if x.count(".") <= 1 else None

>>> token = "My pants got 2.5 legs"
>>> extract_digits(token)
'2.5'
>>> to_float(_)
2.5
>>> token = "this is not a valid number: 2.5.52"
>>> extract_digits(token)
'2.5.52'
>>> to_float(_)
None
1 голос
/ 04 августа 2011

Ответ Майкла Барбера будет наилучшим для скорости, так как в этом нет лишней логики. Если по какой-то причине вы обнаружите, что вам нужно сделать более детальную оценку, вы можете использовать модуль регулярных выражений стандартной библиотеки Python. Это поможет вам, если вы, например, решите, что хотите получить число, подобное описанному, но у вас есть дополнительные критерии, на которые вы хотите наложить слой.

import re
mystring = '.0323asdffa'

def find_number_with_or_without_decimal(mystring):
    return re.findall(r"^\.?\d+", mystring)

In [1]: find_number_with_or_without_decimal(mystring)
Out[1]: ['.0323']

Регулярное выражение говорит: «найдите то, что начинается с одного десятичного знака (« ^ »означает только в начале строки, а«? »Означает до одного; десятичное число экранируется с помощью« \ », поэтому оно выигрывает не имеет специального регулярного выражения, означающего «любой символ») и имеет любое количество цифр. Удачи с Python!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...