我可以使用python ast模块吗?

时间:2010-06-18 12:51:18

标签: python parsing

我想编写一个以这种方式修改python程序的程序:

变化

“一些文字字符串%”%SOMETHING

functioncall(“some literal string%”)%SOMETHING

谢谢,

4 个答案:

答案 0 :(得分:2)

tokenize可能更简单 - 调整文档中的示例

import cStringIO
import tokenize

class Lookahead(object):

  def __init__(self, s):
    self._t = tokenize.generate_tokens(cStringIO.StringIO(s).readline)
    self.lookahead = next(self._t, None)

  def __iter__(self):
    return self

  def next(self):
    result = self.lookahead
    if result is None: raise StopIteration
    self.lookahead = next(self._t, None)
    return result


def doit(s):
  toks = Lookahead(s)
  result = []
  for toktype, tokvalue, _, _, _ in toks:
    if toktype == tokenize.STRING:
      pk = toks.lookahead
      if pk is not None and pk[0] == tokenize.OP and pk[1] == '%':
        result.extend([
            (tokenize.NAME, 'functioncall'),
            (tokenize.OP, '('),
            (tokenize.STRING, repr(tokvalue)),
            (tokenize.OP, ')')
        ])
        continue
    result.append((toktype, tokvalue))
  return tokenize.untokenize(result)


print doit('"some literal string %" % SOMETHING')

这会打印functioncall ('"some literal string %"')%SOMETHING。间距非常奇特(需要更多努力才能使间距恰到好处 - 但是对于从修改后的AST重建源来说情况更糟),但如果您要做的就是导入/运行,那就没关系了。结果代码(如果你想获得可读性和可编辑的代码,那就不那么好了 - 但这是一个足够大的问题,我建议单独使用Q; - )。

答案 1 :(得分:1)

您可以通过编写程序来解决这个问题。而只是使用有史以来最好的编辑器:Emacs。值得学习,如果你还没有。有了它,您可以通过使用其正则表达式替换功能来解决这个问题。唯一的麻烦是我很少使用正则表达式,所以我总是忘记了神秘语法的细节,还得继续查看:P我会再试一次。这是Search & Replace Info for Emacs - scroll down for using regex's

的链接

答案 2 :(得分:0)

Here是另一个可能有用的问题。

我认为ast模块没有返回源代码的工具,但是Armin Ronacher编写了一个模块codegen,它实现了to_source函数来实现这一点用于ast个节点。

我自己没试过这样做。

答案 3 :(得分:0)

import re

pattern = r'(".+? %")(?= %)'
oldstr = '"some literal string %" % SOMETHING'

newstr = re.sub(pattern, r'functioncall(\1)', oldstr)

尝试类似的东西。 (当然,虽然有文件I / O.)我还没有和ast一起工作,所以我真的不知道是否使用它会更容易这样的东西,但它似乎我,如果你只是做一个简单的搜索替换,而不是实际做了很多复杂的解析,那么就不需要使用ast