从Python中的字符串确定“值的类型”

从Python中的字符串确定“值的类型”,第1张

从Python中的字符串确定“值的类型”

在太过正则表达式之前,您是否考虑过使用ast.literal_eval

例子:

In [35]: ast.literal_eval('1')Out[35]: 1In [36]: type(ast.literal_eval('1'))Out[36]: intIn [38]: type(ast.literal_eval('1.0'))Out[38]: floatIn [40]: type(ast.literal_eval('[1,2,3]'))Out[40]: list

也可以使用Python为您解析它!

好的,这是一个更大的示例

import ast, redef dataType(str):    str=str.strip()    if len(str) == 0: return 'BLANK'    try:        t=ast.literal_eval(str)    except ValueError:        return 'TEXT'    except SyntaxError:        return 'TEXT'    else:        if type(t) in [int, long, float, bool]: if t in set((True,False)):     return 'BIT' if type(t) is int or type(t) is long:     return 'INT' if type(t) is float:     return 'FLOAT'        else: return 'TEXT'testSet=['   1  ', ' 0 ', 'True', 'False',   #should all be BIT         '12', '34l', '-3','03',   #should all be INT         '1.2', '-20.4', '1e66', '35.','-   .2','-.2e6',      #should all be FLOAT         '10-1', 'def', '10,2', '[1,2]','35.9.6','35..','.']for t in testSet:    print "{:10}:{}".format(t,dataType(t))

输出:

   1      :BIT 0        :BITTrue      :BITFalse     :BIT12        :INT34l       :INT-3        :INT03        :INT1.2       :FLOAT-20.4     :FLOAT1e66      :FLOAT35.       :FLOAT-   .2    :FLOAT-.2e6     :FLOAT10-1      :TEXTdef       :TEXT10,2      :TEXT[1,2]     :TEXT35.9.6    :TEXT35..      :TEXT.         :TEXT

如果您肯定要有一个产生相同结果的正则表达式解决方案,那么这里是:

def regDataType(str):    str=str.strip()    if len(str) == 0: return 'BLANK'    if re.match(r'True$|^False$|^0$|^1$', str):        return 'BIT'    if re.match(r'([-+]s*)?d+[lL]?$', str):         return 'INT'    if re.match(r'([-+]s*)?[1-9][0-9]*.?[0-9]*([Ee][+-]?[0-9]+)?$', str):         return 'FLOAT'    if re.match(r'([-+]s*)?[0-9]*.?[0-9][0-9]*([Ee][+-]?[0-9]+)?$', str):         return 'FLOAT'    return 'TEXT'

我不能推荐ast版本的正则表达式。只是让Python解释它认为这些数据类型是什么,而不是使用正则表达式来解释它们…



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5667646.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存