在.py文件中将数百个文字列表重构为文字字符串

时间:2014-03-06 15:43:54

标签: python regex refactoring literals python-2.x

我有一个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中使用了这个正则表达式。

1 个答案:

答案 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的缩进,其他类似的东西,你可能想要在测试时写入临时文件....