如何从表示为字符串的数字中检索Python格式代码?
我将数字数据存储在ASCII txt文件中,即不同参数的值,每个参数有一列。列之间的格式可能不同,但在列中不会更改。 我将数据加载到Python中,对其进行处理并将其写回ASCII文件问题是:数字的格式不应该改变。这意味着小数位数应该仍然相同,exp表示法应该仍然是exp表示法,依此类推。所以我需要的是一个函数,它为表示数字的每个字符串返回格式代码(然后在处理过程中,我可以将其与数字一起存储)注意:参数类型在处理过程中不会改变;i、 e.整数将保持整数,浮点数保持浮点数等(否则,保留格式代码没有多大意义) 我的想法是使用正则表达式来分析字符串,以确定它是否是整数、浮点、指数表示法中的浮点等:如何从表示为字符串的数字中检索Python格式代码?,python,string,numbers,format,Python,String,Numbers,Format,我将数字数据存储在ASCII txt文件中,即不同参数的值,每个参数有一列。列之间的格式可能不同,但在列中不会更改。 我将数据加载到Python中,对其进行处理并将其写回ASCII文件问题是:数字的格式不应该改变。这意味着小数位数应该仍然相同,exp表示法应该仍然是exp表示法,依此类推。所以我需要的是一个函数,它为表示数字的每个字符串返回格式代码(然后在处理过程中,我可以将其与数字一起存储)注意:参数类型在处理过程中不会改变;i、 e.整数将保持整数,浮点数保持浮点数等(否则,保留格式代码没有
重新导入
字符串='3.142'
#阳性匹配,然后检测为
match=re.fullmatch(r'[+|-]*[0-9]+[.][0-9]*',string.strip())
按照这个一般分类,我将解析字符串以确定例如小数位数。比如说
string='3.142'#我从上面知道它是一个浮点数,而不是exp符号。。。
lst=string.strip().split('.'))
如果不是lst[1]:#尾随的零是隐藏的
如果lst[0]中的“+”,则结果=“{:+g}”,否则“{:g}”
其他:
结果='{0:+.'如果'+'在lst[0]中,则为'{0:'
结果+=str(len(lst[1]))+'f}
打印(结果)#给出…“{0:.3f}”
Q:
这似乎是一个相当笨拙的方法;
-有谁有更好的解决方案吗?在思考了一段时间后,我对自己问题的回答是:由于缺乏信息,这是一种不可能的倒置 例如,假设您读取了一个字符串'-5.5'。那么,如果该数字的精度为1位,或者尾部的零刚刚隐藏,则您已经缺少信息。另一个(非数字)问题是,您不知道它是否是一个“有符号”值,即如果它是一个正数,它是否会是“+5.5”。想要更多吗?以“1.2E+1”为例。这可能是整数12。虽然不太可能,但您不能确定 除此之外,Python方面还有一些小限制,例如,据我所知,
{:e}.format()
将始终生成一个有符号、零填充的2位指数(如果是1:
raise TypeError(“不明确的结果-->”,s,gen_类)
#3.基于一般分类,调用字符串解析函数
方法\u name='parse\u'+str(gen\u类[0])
method=getattr(self,method_name,lambda*args:“未定义格式!”)
返回方法,*12月~9月
def解析dec(self、s、dec\u sep):
lst=s.split(12月至9月)
如果len(lst[1])==0,则结果='{:f}',否则'{:.'+str(len(lst[1]))+'f}'
result=result。如果lst[0]中的“+”,则替换(“:”,“:+”)else result
返回(结果,浮动)
def解析否dec(self,s,*dec\u sep):
结果='{:+d}'如果'+'在s else'{:d}'中
返回(结果,整数)
def parse_exp_dec(self、s、dec_sep):
第一次12月=s.split(12月-9月)
lst_E=lst_dec[1].upper().split('E')
结果='{:.'+str(len(lst_E[0]))+'E}'
结果=结果。如果lst_dec[0]中的“+”,则替换(“:”,“:+”)否则结果
返回(结果,浮动)
def解析表编号(self,s,*dec\u sep):
lst_E=s.upper().split('E'))
如果lst_E[0]中的“+”,则结果=“{:+E}”,否则“{:E}”
返回(结果,浮动)
以及测试:
valid=['45','45','3E5','4E+5','3E-3','2.345E+7','-7',',
“-45.3”、“-3.4E3”、“12”、“8.8E1”、“+5.3”、“+4”,
“+10”、“+2.3E121”、“+4e-3”、“-204E-9668”、“.7”、“+7”]
无效=['tesT'、'Test45'、'7,7E2'、'204-100'、'
如果您有任何改进的想法,我很乐意将其包括在内!我想人们已经遇到了这个问题。在思考了一段时间后,我对自己问题的回答是:由于缺乏信息,这是一种不可能的倒置 例如,假设您读取了一个字符串'-5.5'。那么,如果该数字的精度为1位,或者尾部的零刚刚隐藏,则您已经缺少信息。另一个(非数字)问题是,您不知道它是否是一个“有符号”值,即如果它是一个正数,它是否会是“+5.5”。想要更多吗?以“1.2E+1”为例。这可能是整数12。虽然不太可能,但您不能确定 除此之外,Python方面还有一些小限制,例如,据我所知,
{:e}.format()
将始终生成一个有符号、零填充的2位指数(如果是1:
raise TypeError(“不明确的结果-->”,s,gen_类)
#3.基于一般分类,调用字符串解析函数
方法\u name='parse\u'+str(gen\u类[0])
method=getattr(self,method_name,lambda*args:“未定义格式!”)
返回方法,*12月~9月
def解析dec(self、s、dec\u sep):
lst=s.split(12月至9月)
如果len(lst[1])==0,则结果='{:f}',否则'{:.'+str(len(lst[1]))+'f}'
result=result。如果lst[0]中的“+”,则替换(“:”,“:+”)else result
返回(结果,浮动)
def解析否dec(self,s,*dec\u sep):
结果='{:+d}'如果'+'在s else'{:d}'中
返回(结果,整数)
def parse_exp_dec(self、s、dec_sep):
第一次12月=s.split(12月-9月)
lst_E=lst_dec[1].upper().split('E')
结果='{:.'+str(len(lst_E[0]))+'E}'
结果=结果。如果lst_dec[0]中的“+”,则替换(“:”,“:+”)否则结果
返回(结果,浮动)
def解析表编号(self,s,*dec\u sep):
lst_E=s.upper().split('E'))
如果lst_E[0]中的“+”,则结果=“{:+E}”,否则“{:E}”
返回(结果,浮动)
以及测试:
valid=['45','45','3E5','4E+5','3E-3','2.345E+7','-