我试图制作一个脚本,让我能够自动清理linux内核中的清理工作。我议程上的第一件事是删除对于单个语句块不必要的if语句(c样式)的大括号({})。现在我在python中使用我对regex的一点知识尝试的代码我进入了一个工作状态,例如:
if (!buf || !buf_len) {
TRACE_RET(chip, STATUS_FAIL);
}
并将脚本转换为:
if (!buf || !buf_len)
TRACE_RET(chip, STATUS_FAIL);
多数民众赞成我想要的但是当我在真实的源文件上尝试它时,似乎它随机选择一个if语句并将其删除它开始大括号并且它有多个语句块并且它通常在程序上删除了结束大括号a else satement或long 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()
提前致谢
答案 0 :(得分:0)
从理论上讲,这主要是有效的:
re.sub(r'(if\s*\([^{]+\)\s*){([^;]*;)\s*}', r'\1\2', yourstring)
请注意,这将在嵌套的单语句块和字符串或字符文字内的分号上失败。
一般来说,尝试用正则表达式解析C代码是一个坏主意,你真的不应该摆脱那些括号。拥有它们是一种很好的做法,它们不会伤害任何东西。