首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Python恢复字符串的格式

如何使用Python恢复字符串的格式
EN

Stack Overflow用户
提问于 2019-04-17 00:42:59
回答 1查看 0关注 0票数 0

我有一个文件由许多固定宽度格式的文本组成。每行可以使用各种宽度和格式的单词和数字的组合。我希望能够在修改一些单词和数字后重写文件。我正计划使用Python函数string.format()来实现这一目标。但是,要做到这一点,我需要为每一行恢复格式规范(这里描述)。

我查看了使用完整的解析器包,例如这里描述的包,但我认为这可能有点过分。我还研究了每行中每个字符的迭代并检查它是什么类型,但结果却非常缓慢而笨重。

我试图放在一起的功能看起来像这样:

代码语言:javascript
运行
复制
def get_format_spec(line):
    '''reads a line (<class 'str'>) and returns the format specification
       (also <class 'str'>) used by str.format().
    '''
    --> PROCESS LINE <--    
    return format_spec 

目标是使功能执行如下:

代码语言:javascript
运行
复制
line = "         1  1.00E+07 autv    5 1000  1.00E-01 -1.00E+00    0       0"
format_spec = get_format_spec(line)
print(format_spec)

>> "{:>10d}{:>10.2E}{:>5}{:>5d}{:>5d}{:>10.2E}{:>10.2E}{:>5d}{:>5d}"
EN

Stack Overflow用户

发布于 2019-04-17 10:32:26

这通常是不可能的,因为有多种格式可以产生任何给定的输出文本。您描述的语义要求您定义输出语言的语法,以便您可以正确地将输入解析为一系列词法标记。然后可以使用格式规范单独描述这些令牌。

如果没有这种语法,退化情况就是微不足道的:每一行都是一个共同长度的字符串。因此,不需要重新格式化。

OP评论后更新

如果字符串唯一地解析为这些令牌,是的,问题是易处理的。考虑到你的一个例子,我希望它易于处理:你有整数,E格式的实数和字母串,整齐地用空格分隔。

我看到四种令牌类型:

  • 特定长度的白色空间;
  • 连续的数字串(整数)
  • 连续的字母串(alpha / string / Hollerith)
  • digit period digit-string E optional-minus digit-string(float)

这是一个非常简单的语法; 无论您选择何种解析工具,都可以在线找到大量帮助。事实上,正则表达式在处理此问题时几乎没有问题。

第二次更新

对此没有一般解决方案; 你不能唯一地解决一些问题,例如1.23E116:是单个浮点数,还是浮点数后跟整数616

但是,如果您可以解决这种歧义,我相信您再次拥有可以使用正则表达式解决的问题。FORTRAN E格式要求允许您从字符串中拉出一个浮点数,因为该点前面只有一个数字。例如:

代码语言:javascript
运行
复制
126.022E232.71828E001.5E01

如下

代码语言:javascript
运行
复制
12 integer
6.022E23 float
2.71828 float
15.0 float
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档