我有一个python文件,包含几十个列表的几十个声明(这导致有几百个这样的列表),如下所示:(原谅占位符)
def someFactoryMethod(self):
self.myValues = [
[<str literal>, <str literal>, <int literal>, <variable name>, <arbitrary literal>, <boolean literal>],
# et cetera
]
我正在尝试将这些列表重构为字典,因此我可以使用键而不是标准化索引(不再缩放)。除了手动编辑文件外,我怎么能这样做呢?我已经尝试了以下正则表达式,希望使用它来查找这些行,然后执行某种替换:
self\.myVals\s*\=\s*\[\s*(\[\s*\'\w+\'\s*\,\s*\'\w+\'\s*\,\s*\d+\s*\,\s*\w+\s*\,r?[\'\"]{0,2}\w+]\'\"]{0,2}\s*\,\s*\w+\s*\,?\]\s*\,)+\s*\,?\]
但无济于事(我不知道它是否会在新行或其他方面绊倒。)
为了它的价值,我在Sublime Text 2中使用了这个正则表达式。
答案 0 :(得分:1)
为什么不在python中这样做?
使用python导入文件(进行解析),使用您对数据结构的了解创建dict),然后使用pprint.pprint输出新的python文件?
====编辑====
假设代码实际运行,可能有用的想法是这样的。为每个具有这些列表(LoL)的方法添加一些代码,看起来像这样
# Unique Marker #1 Start
self.myValues = [
[<str literal>, <str literal>, <int literal>, <variable name>, <arbitrary literal>, <boolean literal>],
]
fixValues(self.myValues, "self.myValues", "Unique Marker 1")
# Unique Marker #1 End
然后fixValues
看起来像这样:
def fixValues(lols, varname, markertext):
lodicts = Whatever you need to do to convert the LoLs into a LoDs
content = open(__file__, "rt").read()
start = content.index(markertext) # Need to increment this to EOL
end = content.index(markertext, start+len(markertext)) # Need to decrement this to BOL
# Try it out on a temp file
f = open(__file__, "wt")
f.write(content[0:start])
f.write("%s%s = ", " "*indent, varname)
pprint.pprint(lodicts, f)
f.write(content[end+len(markertext):]
f.close()
你需要通过计算它所属的行之前的空格来计算varname的缩进,其他类似的东西,你可能想要在测试时写入临时文件....