首页 > 解决方案 > RegEx - 在两个分隔符之间获取多行内容

问题描述

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

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

---------------------------------
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

我只对“内部坐标(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

这是我的正则表达式:

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

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

我怎样才能只得到原子坐标?

提前感谢您的帮助。

标签: pythonregexpython-3.x

解决方案


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

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

检查这个演示

而这个python代码演示


推荐阅读