Python正则表达式问题,可能引用

2024-04-20 05:46:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两种输出

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)
                                                       ^

语法错误:无效语法

我在正则表达式方面没有什么背景,所以我很感激任何帮助。谢谢


Tags: renonesearchbandindexlistclassenergy
2条回答

谢谢你的回复让·弗朗索瓦

我已经成功地创建了这个regex,它可以很好地满足我的需求

cbm=bs.get_cbm() 
searchObj=re.search(r"energy\':\s(.*)", str(cbm),re.I) 
print(searchObj.group())

cbm=bs.get_cbm()返回dict(在这两种情况下),而不是str

你不能(也不必)用正则表达式解析那些

案例a:它返回一个包含"energy"键的字典

所以要知道你是否在案例a中,就这么做吧

"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

相关问题 更多 >