Python:如何获取字符串中的关联值?
sys.stdout.write(“元数据结构:%s\n”%(元数据结构)) 给予Python:如何获取字符串中的关联值?,python,Python,sys.stdout.write(“元数据结构:%s\n”%(元数据结构)) 给予 metadata-structure: # generated using pymatgen data_C _symmetry_space_group_name_H-M 'P 1' _cell_length_a 2.51636378 _cell_length_b 2.51636378 _cell_length_c 2.51636378 _cell_angle_alpha 60.00000000
metadata-structure: # generated using pymatgen
data_C
_symmetry_space_group_name_H-M 'P 1'
_cell_length_a 2.51636378
_cell_length_b 2.51636378
_cell_length_c 2.51636378
_cell_angle_alpha 60.00000000
_cell_angle_beta 60.00000000
_cell_angle_gamma 60.00000000
_symmetry_Int_Tables_number 1
_chemical_formula_structural C
_chemical_formula_sum C2
_cell_volume 11.2669217281
_cell_formula_units_Z 2
loop_
_symmetry_equiv_pos_site_id
_symmetry_equiv_pos_as_xyz
1 'x, y, z'
loop_
_atom_site_type_symbol
_atom_site_label
_atom_site_symmetry_multiplicity
_atom_site_fract_x
_atom_site_fract_y
_atom_site_fract_z
_atom_site_occupancy
C C1 1 0.250000 0.250000 0.250000 1
C C2 1 0.000000 0.000000 0.000000 1
现在,我想提取与变量相关的2.156
_单元长度
如何处理这个长字符串?
我不擅长正则表达式。您可以使用正则表达式查找
\u cell\u length\u a
(或任何其他键),后跟一些空格,然后捕获其后的内容,直到该行结束
>>> import re
>>> re.findall(r"_cell_length_a\s+([0-9.]+)", metadatastructure)
['2.51636378', '2.51636378']
或者将列表理解与拆分行
,开始与
和拆分
:
>>> [line.split()[-1] for line in metadatastructure.splitlines() if line.startswith("_cell_length_a")]
['2.51636378', '2.51636378']
请注意,无论是哪种方式,结果仍然是一个字符串(或字符串列表),并且必须转换为浮点值
:
>>> [float(x) for x in _]
[2.51636378, 2.51636378]
关于您在评论中提出的后续问题:“这里的_cell _formula _units(单位)Z为2。现在,我需要提取_atom(原子)site(空间)占用(空间)行后的下两行,请尝试以下操作:
lines_iter = iter(metadatastructure.splitlines())
for line in lines_iter:
if line.startswith("_cell_formula_units_Z"):
z = int(line.split()[-1])
if "_atom_site_occupancy" in line:
for _ in range(z):
print(next(lines_iter))
您要查找的正则表达式是:
*(\u cell\u length\u a)\s*([0-9]+\.[0-9]*)
。它将返回两个组,如下所示:
将第二个组解析为float,monkey是您的叔叔
虽然我怀疑您可能不需要它,因为它看起来像是结构化的数据,所以如果您可以将其解析为一个类,您将能够访问所有值等。
\u cell\u length\u 2.51636378
具有2.51636378
而不是2.156
?这是字符串还是文件?欢迎@EdGan。首先,你被否决的原因是你的问题质量不是最好的。一个好的问题包括你尝试了什么,它是如何失败的,预期的结果,显然是正确的格式。所以下次请记住这一点。我不想让你对学习感到气馁,所以我不会像这里的大多数人那样对你大发雷霆。这里有一个您正在寻找的正则表达式的解决方案:要知道如何使用它的代码,信息已经存在,请从官方的python正则表达式文档或您找到的任何教程开始。是的。我尝试先输入数字,然后再更改。在上面的解决方案中,有两个组,第一个组包含字符串,第二个组包含您要查找的值。只需将提取的字符串解析为一个浮点,就可以了。alength=re.findall(r“\u cell\u length\u a\s+([0-9.]+)”,metadatastructure)NameError:name're'未定义length=re.findall(r“\u cell\u length\u a\s+([0-9.]+)”,metadatastructure)sys.stdout.write(“alength=%s\n%(alength))输出为:alength=[u'2.51636378']@EdGan您必须导入re
。输出看起来正常,但可能必须转换为float
,以便进一步处理。顺便说一句,为什么你要sys.stdout.write
而不是print
?