2014-02-20 41 views
0

我想寫一個簡單的腳本,將從一堆的Python源代碼文件(除其他事項)之外擦除預先存在的頭塊。例如:蟒蛇re.MULTILINE混淆

########################################## 
    ## This is a header block that 
    ## I want to erase. 
    ## It occurs at the top of a file, 
    ## has a variable number of lines, 
    ## and maybe some blank ones thrown in, like 
    ## 
    ######################################## 


    this is some code that needs to be preserved 

    # and a comment I don't want touched 
    followed by some more code... 

我目前的做法是使用正則表達式將一個空字符串抓住整個街區和sub它,像這樣:

regex = re.compile("^#.*$\n", re.MULTILINE) 
    regex.sub('', filetext, count=1) 

我已經試過了一百變化上re字符串,包括:

"^#.*" 
    "^#+.*" 
    "^#.*\n" 
    ... 

但所有僅擦除塊的第一線(「#」 s的頂部的線)。 Python的聯機文檔說

the pattern character '^' matches at the beginning of the string and at the 
    beginning of each line (immediately following each newline); 

這對我來說意味着它將在單個匹配中包含匹配給定模式的所有連續行。顯然,無論我對re.MULTILINE的理解是錯誤的,還是錯誤地寫了我的regexp。有人能幫助我瞭解發生了什麼,並完成我想要做的事情嗎?謝謝。

回答

0

你並不需要使用多行模式,因爲它是一個頭,你可以使用這個:

^(?:\s*#.*\r?\n)* 

沒有多模式的^的意思僅僅是「字符串的開始」。先例模式將匹配字符串開頭的所有連續行,以#(之前有可能的空格)開頭。

理解此模式最重要的是.默認情況下會匹配除換行符之外的任何字符。我在非捕獲組的末尾放置了一個CRLF (即\r?\n,以使非捕獲組能夠重複。

當正則表達式引擎添加一行不以下列開頭的行時:可能的空格+尖銳,則匹配結束。

然而,由於我在非捕獲組的開頭使用\s*(任何白色空間,包括垂直的白色空間,如\n匹配),該模式可以匹配類似的東西:

############# 
# header 
############# 

############### 
# someting else if there is nothing that starts 
# a newline with an other character than "#" 
############### 

(換句話說,記住,\s可以匹配換行。但是,如果要禁止這種行爲,你可以代替\s使用[^\S\r\n]。)

我不認爲你對多線模式的理解是錯誤的,但我認爲使用多線模式找到連續線不是最好的主意。

+0

太棒了,這個工程。謝謝。你能解釋爲什麼我對多線模式的理解是錯誤的嗎?另外,爲什麼不是用這個字符串編譯的代碼中的所有其他註釋都不能編譯正則表達式? – wayeast

0

你限制了正則表達式替換到只有1更換Max在這一行:

regex.sub('', filetext, count=1) 

擺脫count=1的:

regex.sub('', filetext) 

count參數限制替換的最大數量,從文檔:

可選參數count是最大數量的模式發生被替換; count必須是一個非負整數。如果省略或爲零,則所有事件將被替換。

+0

如果我這樣做,那麼文件中的所有註釋也會被破壞。我希望我的目標是整個頭部的一個匹配,可以被破壞(計數= 1),並將其餘的單獨留下。 – wayeast