python - 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
---------------------------
我怎样才能只得到原子坐标?
提前感谢您的帮助。
解决方案
您当前的正则表达式有点不正确,而且您正在访问group(0)
您的 python 代码,这将为您提供完全匹配,您应该在 group1 中进行捕获并取回 group1 的内容。这是修改后的正则表达式,它将为您提供您想要的,
INTERNAL COORDINATES \(ANGSTROEM\)\n(?:--------------------------------)\n((?:(?!-+)[\s\S])*)\n(?:---------------------------)
而这个python代码演示
推荐阅读
- android - 将数据保存在一个类中以传递给每个活动
- netlogo - Netlogo 代码框架:意见形成过程和复制器动态/ESS
- django - 获取 Django 查询集中所有字段的总和
- powershell - 每种语言/国家/地区的 $_.passwordLastset.AddDays(30)
- ios - 如何在 Swift 4 上使用我自己的 Mapbox 样式和 Mapkit?
- sql - 由于 Decimal 数据类型导致的表创建错误
- hibernate - 使用 Hibernate 找不到类定义错误
- android - 每 1 分钟(60*1000 毫秒)调用一次 api,最长 10 小时
- java - 试运行提前结束
- angular - Seedstack W20 和 Angular 2+