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

时间:2017-01-15 09:54:09

标签: python regex

我有两种类型的输出

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:语法无效

我在正则表达式方面的背景很少,所以我很感激任何帮助。感谢

2 个答案:

答案 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())