正则表达式获取两个分隔符之间的多行内容

2024-09-30 16:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用正则表达式获取两个分隔符之间的(多行)内容

这是我正在解析的大文件的一个片段:

---------------------------------
CARTESIAN COORDINATES (ANGSTROEM)
---------------------------------
  Co     0.000000    0.000000    0.000000
  O      4.000000    0.000000    0.000000
  H      4.584210    0.809570    0.000000
  H      4.583362   -0.810106   -0.001552

----------------------------
CARTESIAN COORDINATES (A.U.)
----------------------------
  NO LB      ZA    FRAG     MASS         X           Y           Z
   0 Co   27.0000    0    58.930    0.000000    0.000000    0.000000
   1 O     8.0000    0    15.999    7.558905    0.000000    0.000000
   2 H     1.0000    0     1.008    8.662901    1.529866    0.000000
   3 H     1.0000    0     1.008    8.661299   -1.530878   -0.002933

--------------------------------
INTERNAL COORDINATES (ANGSTROEM)
--------------------------------
 Co     0   0   0     0.000000000000     0.00000000     0.00000000
 O      1   0   0     4.000000000000     0.00000000     0.00000000
 H      2   1   0     0.998351400325   125.81533088     0.00000000
 H      2   1   3     0.998290967411   125.75782425   180.10977070

---------------------------
INTERNAL COORDINATES (A.U.)
---------------------------
 Co     0   0   0     0.000000000000     0.00000000     0.00000000
 O      1   0   0     7.558904535685     0.00000000     0.00000000
 H      2   1   0     1.886610732031   125.81533088     0.00000000
 H      2   1   3     1.886496530374   125.75782425   180.10977070

我只对“内部坐标(埃)”部分感兴趣(只有原子和坐标)。所以,这就是我想要保留的:

 Co     0   0   0     0.000000000000     0.00000000     0.00000000
 O      1   0   0     4.000000000000     0.00000000     0.00000000
 H      2   1   0     0.998351400325   125.81533088     0.00000000
 H      2   1   3     0.998290967411   125.75782425   180.10977070

这是我的正则表达式:

r"INTERNAL COORDINATES \(ANGSTROEM\)\n(--------------------------------)\n([\s\S]*?)\n(---------------------------)"

这是我的代码,到目前为止:

import re
import pandas as pd

with open(input_path, "r") as inp:
    inp_content = inp.read()

    int_coord = r"INTERNAL COORDINATES \(ANGSTROEM\)\n(--------------------------------)\n([\s\S]*?)\n(---------------------------)"
    coord_matches = re.finditer(int_coord, inp_content, re.MULTILINE)

    for i in coord_matches:
        my_var = i.group(0)
        print(my_var)

问题是我得到了包含分隔符的部分,如下所示:

---------------------------
INTERNAL COORDINATES (ANGSTROEM)
--------------------------------
 Co     0   0   0     0.000000000000     0.00000000     0.00000000
 O      1   0   0     1.200000000000     0.00000000     0.00000000
 H      2   1   0     0.998351400325   125.81533088     0.00000000
 H      2   1   3     0.998290967411   125.75782425   180.10977070

---------------------------
INTERNAL COORDINATES (ANGSTROEM)
--------------------------------
 Co     0   0   0     0.000000000000     0.00000000     0.00000000
 O      1   0   0     1.100000000000     0.00000000     0.00000000
 H      2   1   0     0.998351400325   125.81533088     0.00000000
 H      2   1   3     0.998290967411   125.75782425   180.10977070

---------------------------
INTERNAL COORDINATES (ANGSTROEM)
--------------------------------
 Co     0   0   0     0.000000000000     0.00000000     0.00000000
 O      1   0   0     1.000000000000     0.00000000     0.00000000
 H      2   1   0     0.998351400325   125.81533088     0.00000000
 H      2   1   3     0.998290967411   125.75782425   180.10977070

---------------------------

我怎样才能得到原子坐标

提前感谢您的帮助


Tags: importreascontentintinternalinpmatches
1条回答
网友
1楼 · 发布于 2024-09-30 16:20:24

您当前的正则表达式有点不正确,而且您正在访问python代码中的group(0),这将为您提供完全匹配,您应该在group1中捕获并获取group1的内容。这是经过修改的正则表达式,它将完全满足您的需要

INTERNAL COORDINATES \(ANGSTROEM\)\n(?:                )\n((?:(?!-+)[\s\S])*)\n(?:             -)

Check this Demo

而这个python code demo

相关问题 更多 >