Python - 替换C程序的一部分,但跳过注释

时间:2016-03-28 20:38:02

标签: python regex

使用Python和正则表达式我需要在C程序中的每个赋值运算符的两侧添加一个空格,但跳过注释中的运算符:

int x;
int y=100;
x=y;
// a=b+c
/* i=j+k */

以上需要翻译成:

int x;
int y = 100;
x = y;
// a=b+c
/* i=j+k */

我尝试使用此正则表达式跳过单行注释:

try:
    source = re.sub(r'(?<!//)(.*)([^\s])=([^\s])', r'\1\2 = \3', source)
except Exception as e:
    pass

但它不起作用。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以尝试这样做:

for line in open("file_to_be_formated.c"):
    li=line.strip()
    if not (li.startswith("//") or li.startswith("/*")):
        # format code

将跳过注释行的正则表达式如下:

(?://[^\n]*|/\*(?:(?!\*/).)*\*/)

一个小例子:

import re

my_string = """// my single line comment
another random text
/*some multi-line
comment*/
"""

m = re.findall(r'(?://[^\n]*|/\*(?:(?!\*/).)*\*/)', my_string, re.DOTALL)
print(m)

输出将是包含匹配注释的列表:

['// my single line comment', '/*some multi-line\ncomment*/']

答案 1 :(得分:0)

这个问题比你想象的要困难一些。考虑到C有运算符$!===+=等等。可能有字符-="a=b" s char甚至'='short,如int'=='。评论可能是多行的。你还应断言C代码是正确的。

使用正则表达式是不可能的。

尝试使用简单的状态机思想来解析C代码。我认为可以使用函数和'===='if运算符来实现它。您可以过滤掉while未分配的代码段。使用更复杂的代码,您可以处理包含=作为其中一部分的运算符,如果您愿意,也可以将它们包装在空格中。

或者,您可以使用正则表达式在注释和字符串之间的代码中引入空格。这样的正则表达式看起来像=,它们被(?<=^|\w|\d) ?= ?(?<=^|\w|\d)替换。但我仍然不确定这个正则表达式可以覆盖主要的角落案件。