Я думаю, что ваше решение в порядке.
Сказав это, в этих ответах много ненависти к регулярным выражениям, которые, на мой взгляд, неоправданны, регулярные выражения могут быть достаточно чистыми, правильными и быстрыми. Это действительно зависит от того, что вы пытаетесь сделать. Первоначальный вопрос заключался в том, как можно «проверить, можно ли представить строку в виде числа (с плавающей запятой)» (согласно вашему названию). Предположительно, вы захотите использовать числовое значение / значение с плавающей запятой после того, как вы проверите, что оно допустимо, и в этом случае ваша попытка / исключение имеет большой смысл. Но если по какой-то причине вы просто хотите проверить, что строка является числом , тогда регулярное выражение также работает нормально, но его трудно получить правильно. Я думаю, что большинство ответов на регулярные выражения до сих пор, например, неправильно анализируют строки без целочисленной части (такой как ".7"), которая является плавающей точкой в том, что касается python. И это немного сложно проверить в одном регулярном выражении, где дробная часть не требуется. Я включил два регулярных выражения, чтобы показать это.
Это поднимает интересный вопрос о том, что такое «число». Вы включаете "inf", который является допустимым как float в python? Или вы включаете числа, которые являются «числами», но, возможно, не могут быть представлены в Python (например, числа, которые больше, чем максимум с плавающей точкой).
Есть также неясности в том, как вы анализируете числа. Например, как насчет "--20"? Это «число»? Это законный способ представлять «20»? Python позволит вам сделать "var = --20" и установить его в 20 (хотя на самом деле это потому, что он обрабатывает это как выражение), но float ("- 20") не работает.
В любом случае, без дополнительной информации, вот регулярное выражение, которое, я считаю, охватывает все числа и числа с плавающей запятой , когда python анализирует их .
# Doesn't properly handle floats missing the integer part, such as ".7"
SIMPLE_FLOAT_REGEXP = re.compile(r'^[-+]?[0-9]+\.?[0-9]+([eE][-+]?[0-9]+)?$')
# Example "-12.34E+56" # sign (-)
# integer (12)
# mantissa (34)
# exponent (E+56)
# Should handle all floats
FLOAT_REGEXP = re.compile(r'^[-+]?([0-9]+|[0-9]*\.[0-9]+)([eE][-+]?[0-9]+)?$')
# Example "-12.34E+56" # sign (-)
# integer (12)
# OR
# int/mantissa (12.34)
# exponent (E+56)
def is_float(str):
return True if FLOAT_REGEXP.match(str) else False
Некоторые примеры тестовых значений:
True <- +42
True <- +42.42
False <- +42.42.22
True <- +42.42e22
True <- +42.42E-22
False <- +42.42e-22.8
True <- .42
False <- 42nope