在太过正则表达式之前,您是否考虑过使用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解释它认为这些数据类型是什么,而不是使用正则表达式来解释它们…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)