我是python的新手,我正在尝试编写一个脚本来解析下面文本文件中每对标题之间包含的数据。
<Keywords>
GTO
</Keywords>
<NumberofNuclei>
2
</NumberofNuclei>
<Nuclear Charges>
6.0
8.0
1.0
1.0
</Nuclear Charges>
<Primitive Exponents>
8.264000000000e+01 1.241000000000e+01 2.824000000000e+00
8.989000000000e-02 2.292000000000e+00 2.292000000000e+00
8.380000000000e-01 8.380000000000e-01 2.920000000000e-01
</Primitive Exponents>
我尝试执行此操作的代码如下所示。但是,在保留其3x3结构的同时,我难以在Primitive Exponents下解析矩阵。我不希望它写成列表。
with open('toysystem.txt','r') as f:
data = f.read()
nc = re.findall(r'<Nuclear Charges>(.*?)</Nuclear Charges>',data,re.DOTALL)
nc1 = [elem.replace('\n',',').strip(',') for elem in nc]
non = re.findall(r'<NumberofNuclei>(.*?)</NumberofNuclei>',data,re.DOTALL)
non1 = int("".join(map(str, non)))
kw = re.findall(r'<Keywords>(.*?)</Keywords>',data,re.DOTALL)
kw1 = "".join(map(str, kw)).replace('\n','')
pe = np.array(re.findall(r'<Primitive Exponents>(.*?)</Primitive Exponents>',data,re.DOTALL))
有关如何处理此问题的任何想法/修改我的代码以提取矩阵(3x3数组)?
谢谢!
答案 0 :(得分:0)
你遇到了麻烦,因为findall()
返回一个列表,在这种情况下是一个包含一个元素的列表,numpy.array()
合理地将一个列表转换为一个包含一个元素的数组。在你要求numpy把它变成一个数组之前,需要做一些工作才能把字符串变成一个3x3矩阵。
pe_match = re.search(r'<Primitive Exponents>(.*?)</Primitive Exponents>',data,re.DOTALL)
# Extract the numbers from the enclosing tags and split into 3 lines
matrix = pe_match.group(1).strip("\n").split("\n")
# Turn each line into a 3-list
matrix2 = [m.split() for m in matrix]
pe = np.array(matrix2)
这为你提供了3x3 numpy字符串数组。
array([['8.264000000000e+01', '1.241000000000e+01', '2.824000000000e+00'],
['8.989000000000e-02', '2.292000000000e+00', '2.292000000000e+00'],
['8.380000000000e-01', '8.380000000000e-01', '2.920000000000e-01']],
dtype='|S18')
当然,您可以在使用之前进行进一步的转换,但您的问题是关于矩阵结构。