我可以为此使用python ast模块吗?

我可以为此使用python ast模块吗?,python,parsing,Python,Parsing,我想编写一个程序,以这种方式修改python程序: 改变 “一些文字字符串%%SOMETHING 到 functioncall(“某些文字字符串%”)%SOMETHING 谢谢,您可以通过编写程序来解决这个问题。相反,只需使用有史以来最好的编辑器:Emacs。如果你还没有学过,那就值得一学。有了它,您可以通过使用它的正则表达式替换功能来解决这个问题。唯一的问题是,我很少使用正则表达式,所以我总是忘记了神秘语法的细节,仍然需要查找:P我将尝试为您再次找出它。这里有一个链接到,通过修改文档中的示例可

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

改变

“一些文字字符串%%SOMETHING

functioncall(“某些文字字符串%”)%SOMETHING


谢谢,

您可以通过编写程序来解决这个问题。相反,只需使用有史以来最好的编辑器:Emacs。如果你还没有学过,那就值得一学。有了它,您可以通过使用它的正则表达式替换功能来解决这个问题。唯一的问题是,我很少使用正则表达式,所以我总是忘记了神秘语法的细节,仍然需要查找:P我将尝试为您再次找出它。这里有一个链接到

,通过修改文档中的示例可能会更简单

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;-)。

是另一个可能有用的so问题

我推测,
ast
模块没有返回源代码的功能,但是Armin Ronacher编写了一个模块,它实现了一个
to_source
函数,只用于
ast
节点

我自己还没试过这么做

import re

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

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

尝试类似的方法(当然是使用文件I/O)我还没有使用过
ast
,所以我真的不知道这样做是否更容易,但在我看来,如果你只是做一个简单的搜索替换,而不是真正做很多复杂的解析,那么就没有必要使用
ast

,我需要一种戏剧性的方法,这样我就可以了把它作为一种预处理器包含在另一个程序中。理论上,是吗?但是如果你想在代码方面做到这一点,那么只需使用python的
re
模块来处理正则表达式。夸张地说,我键入了?F*ing拼写检查器。我是编程上的。我希望你可以使用python中的re.sub来查找匹配的模式,并用随便你。AST在python 2.6中是不推荐的,在3.0中是adios,所以…Regex可以轻松处理这个问题。作为Emacs用户,我觉得有必要补充一点,Emacs不是“轻松”使用Regex的唯一方法。“编程”选项还可以包括许多*nix工具(“sed”,等等)以及Python、Perl等语言。使用2to3工具可能会有更好的运气,它是为源代码到源代码转换而设计的。与OP所要求的相比,似乎有不必要的引号。我相信用tokvalue替换repr(tokvalue)会得到期望的结果。