Я думаю, що ваше рішення добре, але є правильна реагепс-реалізація.
Здається, що у цих відповідях є багато ненависті, що, на мою думку, є невиправданим, регулярні виразки можуть бути досить чистими, правильними та швидкими. Це дійсно залежить від того, що ти намагаєшся зробити. Первісне запитання полягало в тому, як ви можете "перевірити, чи може рядок представлений у вигляді числа (float)" (відповідно до вашої назви). Імовірно, ви хочете використовувати числове / плаваюче значення, як тільки переконаєтесь, що воно дійсне, і в цьому випадку ваша спроба / за винятком має багато сенсу. Але якщо з якоїсь причини ви просто хочете перевірити цей рядок - це числото регулярний вираз також працює чудово, але виправити це важко. Я думаю, що більшість відповідей регулярних виразів досі, наприклад, не розбирають належним чином рядки без цілої частини (наприклад, ".7"), яка є поплавком, що стосується python. І це трохи складно перевірити в одному регексі, де дробова частина не потрібна. Я включив два регулярні вирази, щоб показати це.
Це справді викликає цікаве питання щодо того, що таке "число". Ви включаєте "inf", який дійсний як float у python? Або ви включаєте числа, які є "числами", але, можливо, вони не можуть бути представлені в python (наприклад, числа, що перевищують максимум плавця).
Існують також неоднозначності в аналізі чисел. Наприклад, що з "--20"? Це "число"? Це законний спосіб представити "20"? Python дозволить вам зробити "var = --20" і встановити його на 20 (хоча це дійсно так, тому що він трактує це як вираз), але float ("- 20") не працює.
У будь-якому випадку, без додаткової інформації, ось такий регулярний вираз, який, на мою думку, охоплює всі вбудовані та плаваючі елементи, як пітон розбирає їх .
# 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
Запуск бенчмаркінг коду @ RON-Рейтер відповіді показують , що регулярне вираз насправді швидше , ніж нормальні регулярні вирази і набагато швидше при обробці поганих значень , ніж виняток, що робить будь - то сенс. Результати:
check_regexp with good floats: 18.001921
check_regexp with bad floats: 17.861423
check_regexp with strings: 17.558862
check_correct_regexp with good floats: 11.04428
check_correct_regexp with bad floats: 8.71211
check_correct_regexp with strings: 8.144161
check_replace with good floats: 6.020597
check_replace with bad floats: 5.343049
check_replace with strings: 5.091642
check_exception with good floats: 5.201605
check_exception with bad floats: 23.921864
check_exception with strings: 23.755481