Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何获取字符串中的关联值?_Python - Fatal编程技术网

Python:如何获取字符串中的关联值?

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

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