0

我试图制作一个脚本来让我在 linux 内核中自动清理一点。我议程上的第一件事是删除单语句块不需要的 if 语句(c 样式)上的大括号({})。现在,我用我对python中正则表达式的一点了解尝试的代码进入了工作状态,例如:

if (!buf || !buf_len) {
        TRACE_RET(chip, STATUS_FAIL);
        }

脚本将其变成:

if (!buf || !buf_len) 
        TRACE_RET(chip, STATUS_FAIL);

这就是我想要的,但是当我在真实的源文件上尝试它时,它似乎随机选择一个 if 语句并将其删除,它的开头大括号并且它有多个语句块,并且它通常在一个 else 语句中删除程序很远的结尾大括号或长 if 语句。

所以有人可以帮我让脚本只触及 if 语句,如果它有一个块语句并正确删除它对应的开始和结束括号。

正确的脚本如下所示:

from sys import argv
import os
import sys
import re

get_filename = argv[1]
target = open(get_filename)
rename = get_filename + '.tmp'
temp = open(rename, 'w')

def if_statement():
    look=target.read()
    pattern=r'''if (\([^.)]*\)) (\{)(\n)([^>]+)(\})'''
    replacement=r'''if \1 \3\4'''
    pattern_obj = re.compile(pattern, re.MULTILINE)
    outtext = re.sub(pattern_obj, replacement, look)
    temp.write(outtext)
    temp.close()
    target.close()


if_statement()

提前致谢

4

1 回答 1

0

从理论上讲,这主要是可行的:

re.sub(r'(if\s*\([^{]+\)\s*){([^;]*;)\s*}', r'\1\2', yourstring)

请注意,这将在嵌套的单语句块以及字符串或字符文字中的分号上失败。

一般来说,尝试用正则表达式解析 C 代码是个坏主意,而且你真的不应该摆脱那些大括号。拥有它们是一种很好的做法,它们不会伤害任何东西。

于 2012-08-14T01:16:34.657 回答