2012-08-14 113 views
0

我正在嘗試創建一個腳本,允許我在Linux內核中自動清理一些內容。我的議程上的第一件事是刪除對單個語句塊不必要的if語句(c樣式)的大括號({})。現在我可以用Python我到工作狀態我正則表達式的小知識試過的代碼,如:Python搜索和替換文件

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

和腳本把它變成:

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

,這是我想要的東西,但是當我在真正的源文件上嘗試它,它似乎隨機選擇一個if語句並將其刪除,並且它具有多個語句塊,並且通常在其他語句或long語句中刪除遠離程序的結尾括號。

所以有人可以幫助我讓腳本只觸及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() 

感謝

+2

不要用正則表達式解析C代碼。在單行'if'語句中使用大括號是一種很好的做法。 – JBernardo 2012-08-14 01:07:26

回答

0

從理論上講,這將主要工作:

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

注意,這將會對嵌套單語句塊失敗和字符串或字符文字中的分號。

一般來說,試圖用正則表達式來解析C代碼是一個糟糕的主意,無論如何你真的不應該擺脫這些大括號。擁有它們並且不傷害任何東西是個好習慣。

+0

是的,我同意你應該把它留給好的練習;但是,就像我說的,我只是用它來解析Linux內核中的C代碼,如果你使用他們的腳本checkpatch.pl它會告訴你它沒有必要大括號,如果我沒有這樣做有人會。你的答案工作更準確,然後意味着除嵌套語句和其他(S)。 – user1596761 2012-08-14 02:18:21