TL; DRทางออกที่ดีที่สุดคือs.replace('.','',1).isdigit()
ฉันได้ทำการเปรียบเทียบเปรียบเทียบวิธีการที่แตกต่างกัน
def is_number_tryexcept(s):
""" Returns True is string is a number. """
try:
float(s)
return True
except ValueError:
return False
import re
def is_number_regex(s):
""" Returns True is string is a number. """
if re.match("^\d+?\.\d+?$", s) is None:
return s.isdigit()
return True
def is_number_repl_isdigit(s):
""" Returns True is string is a number. """
return s.replace('.','',1).isdigit()
หากสตริงไม่ใช่ตัวเลขบล็อกยกเว้นจะค่อนข้างช้า แต่ที่สำคัญกว่านั้นลองดูข้อยกเว้นเป็นวิธีการเดียวที่จัดการกับสัญลักษณ์ทางวิทยาศาสตร์ได้อย่างถูกต้อง
funcs = [
is_number_tryexcept,
is_number_regex,
is_number_repl_isdigit
]
a_float = '.1234'
print('Float notation ".1234" is not supported by:')
for f in funcs:
if not f(a_float):
print('\t -', f.__name__)
เครื่องหมายลอย ".1234" ไม่ได้รับการสนับสนุนโดย:
- is_number_regex
scientific1 = '1.000000e+50'
scientific2 = '1e50'
print('Scientific notation "1.000000e+50" is not supported by:')
for f in funcs:
if not f(scientific1):
print('\t -', f.__name__)
print('Scientific notation "1e50" is not supported by:')
for f in funcs:
if not f(scientific2):
print('\t -', f.__name__)
วิทยาศาสตร์สัญกรณ์ "1.000000e + 50" ไม่ได้รับการสนับสนุนโดย:
- is_number_regex
- is_number_repl_isdigit
สัญกรณ์วิทยาศาสตร์ "1e50" ไม่ได้รับการสนับสนุนโดย:
- is_number_regex
- is_number_repl_isdigit
แก้ไข: ผลลัพธ์มาตรฐาน
import timeit
test_cases = ['1.12345', '1.12.345', 'abc12345', '12345']
times_n = {f.__name__:[] for f in funcs}
for t in test_cases:
for f in funcs:
f = f.__name__
times_n[f].append(min(timeit.Timer('%s(t)' %f,
'from __main__ import %s, t' %f)
.repeat(repeat=3, number=1000000)))
ที่ทดสอบฟังก์ชั่นต่อไปนี้
from re import match as re_match
from re import compile as re_compile
def is_number_tryexcept(s):
""" Returns True is string is a number. """
try:
float(s)
return True
except ValueError:
return False
def is_number_regex(s):
""" Returns True is string is a number. """
if re_match("^\d+?\.\d+?$", s) is None:
return s.isdigit()
return True
comp = re_compile("^\d+?\.\d+?$")
def compiled_regex(s):
""" Returns True is string is a number. """
if comp.match(s) is None:
return s.isdigit()
return True
def is_number_repl_isdigit(s):
""" Returns True is string is a number. """
return s.replace('.','',1).isdigit()