社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用python区分特定格式的文本

user9335777 • 5 年前 • 1331 次点击  

好吧,所以我有一个问题要问,我不知道该怎么说,我也找不到任何东西在互联网上同样的原因。但是我有一个大的文本文件,它是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
 
1331 次点击  
文章 [ 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=“(三个空格)分割内容,最后创建一个单独部分的字典。标题是键,以下行是值。