Py学习  »  Python

用python区分特定格式的文本

user9335777 • 5 年前 • 1366 次点击  

好吧,所以我有一个问题要问,我不知道该怎么说,我也找不到任何东西在互联网上同样的原因。但是我有一个大的文本文件,它是nastran作业的输出;下面是一个示例:

                                         D I S P L A C E M E N T   V E C T O R

  POINT ID.   TYPE          T1             T2             T3             R1             R2             R3
    158819      G      1.709110E-04   7.605540E-16  -1.555717E-15  -4.860894E-18   1.829865E-03  -2.318361E-02
    158820      G      1.875926E-04   7.603908E-16  -1.382438E-15   2.883937E-18   3.121088E-04   2.332622E-02
    158821      G      1.275168E-04   6.281925E-16  -1.472595E-15  -1.425970E-17   4.282258E-03  -1.669750E-02
    158822      G      1.712281E-04   7.267596E-16  -1.473447E-15  -2.136693E-18   1.425850E-03   2.210620E-02
    158823      G      1.010464E-04   5.633097E-16  -1.426041E-15  -3.498301E-17   4.969753E-03  -1.144002E-02
    158824      G      1.274082E-04   6.164795E-16  -1.567410E-15  -5.947361E-18   3.224372E-03   1.580865E-02
                                                 L O A D   V E C T O R

  POINT ID.   TYPE          T1             T2             T3             R1             R2             R3
    158801      G      1.175810E+02  -3.610042E-16  -2.782717E-12   0.0            0.0            0.0
    158802      G      8.539756E+01   1.118419E-15  -2.639934E-12   0.0            0.0            0.0
    158803      G      9.717072E+01  -7.574143E-16  -2.682750E-12   0.0            0.0            0.0
    158804      G      1.175825E+02   0.0           -2.986422E-12   0.0            0.0            0.0

如您所见,nastran创建文件的方法是在每个部分的标题中使用所有大写的名称,每个字母之间有一个空格,每个单词之间有三个空格。所以我的问题是,如果我有一个寻找点id的脚本,在文件中,我如何编写它,这样如果我指定了一个节,它会寻找带有格式的节名,但它也会在下一节停止,而不管节名是什么,但会根据格式停止标题的标题。

非常感谢你的帮助,如果不合理请告诉我。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40965
 
1366 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Paritosh Singh
Reply   •   1 楼
Paritosh Singh    6 年前

您可能一直在寻找的格式化短语可以称为模式匹配,或者 regex .

如果所有其他方法都失败了,那么您应该始终能够使用regex找到一个部分的结尾来解决这个问题。 请注意,使用可以将数据导入panda或类似的、易于管理的逻辑来跟踪此代码可能仍然是明智的。 如果你想调整这个正则表达式,我发现 regex101.com 非常有用。希望这有帮助。

import re    
#matches the pattern UPPERCASE,SPACE followed by (UPPERCASE, SPACE) repeated, 
#followed by TWO SPACE optional
#whole pattern can be repeated. 
#You may want to tweak the rules to make it more strict as necessary.

pattern = re.compile("(([A-Z] )([A-Z] )+(  )?)+")

test = '''                                         D I S P L A C E M E N T   V E C T O R

  POINT ID.   TYPE          T1             T2             T3             R1             R2             R3
    158819      G      1.709110E-04   7.605540E-16  -1.555717E-15  -4.860894E-18   1.829865E-03  -2.318361E-02
    158820      G      1.875926E-04   7.603908E-16  -1.382438E-15   2.883937E-18   3.121088E-04   2.332622E-02
    158821      G      1.275168E-04   6.281925E-16  -1.472595E-15  -1.425970E-17   4.282258E-03  -1.669750E-02
    158822      G      1.712281E-04   7.267596E-16  -1.473447E-15  -2.136693E-18   1.425850E-03   2.210620E-02
    158823      G      1.010464E-04   5.633097E-16  -1.426041E-15  -3.498301E-17   4.969753E-03  -1.144002E-02
    158824      G      1.274082E-04   6.164795E-16  -1.567410E-15  -5.947361E-18   3.224372E-03   1.580865E-02
                                                 L O A D   V E C T O R

  POINT ID.   TYPE          T1             T2             T3             R1             R2             R3
    158801      G      1.175810E+02  -3.610042E-16  -2.782717E-12   0.0            0.0            0.0
    158802      G      8.539756E+01   1.118419E-15  -2.639934E-12   0.0            0.0            0.0
    158803      G      9.717072E+01  -7.574143E-16  -2.682750E-12   0.0            0.0            0.0
    158804      G      1.175825E+02   0.0           -2.986422E-12   0.0            0.0            0.0'''

#your input for beginning of a section header    
begin = 'displacement vector'
#getting it into the correct style laid out here for section headers.
begin = ' '.join(begin.upper()) 
location = test.find(begin)

if location != -1:
    relevant_section = test[location + len(begin):]
else:
    relevant_section = test
#regex matching for end of section
end = pattern.search(relevant_section)
if end is not None:
    end = end.span()[0]
    relevant_section = relevant_section[:end]
Alex_P
Reply   •   2 楼
Alex_P    6 年前

在我的头顶上,我会读入文件,按sep=“(三个空格)分割内容,最后创建一个单独部分的字典。标题是键,以下行是值。