加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:02:20 所属栏目:Python 来源:网络整理
导读:我正在尝试在 python中编写一个函数,它将确定字符串中的值的类型;例如 如果in string为1或0或True或False,则该值为BIT 如果in string为0-9 *,则值为INT 如果在字符串中是0-9 .0-9,则该值为float 如果在字符串中是stg更多(文本等)值是文本 到目前为止,我已经
我正在尝试在 python中编写一个函数,它将确定字符串中的值的类型;例如

如果in string为1或0或True或False,则该值为BIT

如果in string为0-9 *,则值为INT

如果在字符串中是0-9 .0-9,则该值为float

如果在字符串中是stg更多(文本等)值是文本

到目前为止,我已经喜欢了

def dataType(string):

 odp=''
 patternBIT=re.compile('[01]')
 patternINT=re.compile('[0-9]+')
 patternFLOAT=re.compile('[0-9]+.[0-9]+')
 patternTEXT=re.compile('[a-zA-Z0-9]+')
 if patternTEXT.match(string):
     odp= "text"
 if patternFLOAT.match(string):
     odp= "FLOAT"
 if patternINT.match(string):
     odp= "INT"
 if patternBIT.match(string):
     odp= "BIT"

 return odp

但是我在python中使用正则表达式并不是很熟练.你能告诉我,我做错了什么?例如,它不适用于2010-00-10,它应该是Text,但是INT或20.90,它应该是float但是是int

解决方法

在你走到正则表达式路线太远之前,你考虑过使用 ast.literal_eval

例子:

In [35]: ast.literal_eval('1')
Out[35]: 1

In [36]: type(ast.literal_eval('1'))
Out[36]: int

In [38]: type(ast.literal_eval('1.0'))
Out[38]: float

In [40]: type(ast.literal_eval('[1,2,3]'))
Out[40]: list

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

好的,这是一个更大的例子:

import ast,re
def 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        :BIT
True      :BIT
False     :BIT
12        :INT
34l       :INT
-3        :INT
03        :INT
1.2       :FLOAT
-20.4     :FLOAT
1e66      :FLOAT
35.       :FLOAT
-   .2    :FLOAT
-.2e6     :FLOAT
10-1      :TEXT
def       :TEXT
10,2      :TEXT
[1,2]     :TEXT
35.9.6    :TEXT
35..      :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'

我不能推荐高级版本的正则表达式;让Python解释它认为这些数据类型的内容而不是用正则表达式解释它们…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读