我有两种类型的输出
a)
{'projections': {}, 'band_index': [], 'energy': None, 'kpoint_index': [], 'kpoint': []}
b)
{'band_index': defaultdict(<class 'list'>, {<Spin.up: 1>: [9]}), 'kpoint': <pymatgen.electronic_structure.bandstructure.Kpoint object at 0x7f65f2784550>, 'kpoint_index': [28, 29, 188], 'projections': {}, 'energy': 6.5496}
我想用
import re
cbm=bs.get_cbm()
searchObj=re.search(r '\' +str(energy)+ \' : (.*?) (.*)', cbm, re.M|re.I)
print(searchObj.group(1))
其中cbm将简单地返回a)或b)。
我目前收到错误
searchObj=re.search(r '\' +str(energy)+ \' : (.*?) (.*)', cbm, re.M|re.I)
^
SyntaxError:语法无效
我在正则表达式方面的背景很少,所以我很感激任何帮助。感谢
答案 0 :(得分:0)
cbm=bs.get_cbm()
会返回dict
(在这两种情况下),而不是str
。
你不能(而且你不必)用正则表达式解析那些!
案例a:它返回包含"energy"
键的字典。
所以要知道你是否遇到问题,只需要做
"energy" in cbm
另一种方法是使用'band_index'
返回的不同值类型:
if isinstance(cbm["band_index"],list):
# we're in case "a"
pass
elif isinstance(cbm["band_index"],dict): # defaultdict is a dict
# we're in case "b"
pass
答案 1 :(得分:0)
感谢Jean-Francois的回复,
我设法创建了这个正则表达式,它可以满足我的要求。
cbm=bs.get_cbm()
searchObj=re.search(r"energy\':\s(.*)", str(cbm),re.I)
print(searchObj.group())