重命名 Python 源文件中的变量和方法名称

Cur*_*ity 5 python regex python-3.x

我正在尝试编写一个 Python 程序,该程序基本上将原始 Python 源文件作为输入,并将所有变量名称更改为 V,将所有方法或函数名称更改为 F,并保留其他所有内容不变。所以我正在努力实现这一目标:

输入:

def gcd(x, y):
    """Sample docstring."""
    if x == y:
        return x
    if x > y:
        if y == 0: return x
        return gcd(x-y, y)
    if y > x:
        if x == 0: return y
        # Sample comment.
        return gcd(x, y-x)
Run Code Online (Sandbox Code Playgroud)

输出:

def F(V, V):
    """Sample docstring."""
    if V == V:
        return V
    if V > V:
        if V == 0: return V
        return F(V-V, V)
    if V > V:
        if V == 0: return V
        # Sample comment.
        return F(V, V)
Run Code Online (Sandbox Code Playgroud)

Python 源文件中的其他所有内容都将保持原样,包括注释、文档字符串等。我不完全确定如何执行此操作,因为我还希望稍后能够使用 Java 进行同样的处理和 C++ 文件。(即,将所有变量名称更改为 V,将所有函数/方法名称更改为 F)。因此,使用 Python tokenize 模块或 Python ast 模块之类的东西可能不是最好的选择,因为这将限制我只能处理 Python 源文件,而不能处理 Java 或 C++ 文件。

我已经尝试过使用 PLY,但问题是,我必须指定所有正则表达式规则和整个 Python 语法。一定有一种更简单的方法来实现我想要做的事情吗?或者,如果我计划在稍后阶段处理 Java 和 C++ 源代码文件,这是唯一可能的方法吗?

如果我能得到一些关于最佳选择的想法或反馈,那就太好了。

Fed*_*zza 1

如果您有这种代码,您可以使用两个正则表达式。一个获取函数名称,另一个获取变量。

如果您使用此正则表达式:

\w+(?=\()|\b[xy]\b
Run Code Online (Sandbox Code Playgroud)

工作演示

您可以看到它符合您需要的一切。

因此,您可以分别使用这两个正则表达式来替换为您想要的内容。第一步是使用以下命令替换函数名称:

\w+(?=\()
Run Code Online (Sandbox Code Playgroud)

第二个正则表达式是将 X 和 Y 替换为 V:

\b[xy]\b
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

第一个正则表达式:

在此输入图像描述

第二个正则表达式:

在此输入图像描述

  • 正则表达式不应该也不能用于解析这种复杂性的任何内容,破坏正则表达式的一个简单方法是执行“ x == y”。 (2认同)