python re.sub 應用

今天寫了一個正則表達式,用一條命令直接實現了要求,有點小激動。。

要求是把下邊這樣的配置腳本

rule name 64_40

description AAAAAA YYYYYY

rule name 65_80

description XXXXXXX

翻譯成

rule name YYYYYY_40

description AAAAAA YYYYYY

rule name XXXXXXX_80

description XXXXXXX

這樣就搞定了

result = re.sub(r(d+)_(d+.*?description.*?)(w+)(?=
)
,g<3>_g<2>g<3>,fullcontent,0,re.S)

中間有這麼幾個問題。

  1. 匹配描述(description)後邊最後的一段字元串。例如:XXXXXXX或YYYYYY。方法是使用這個:(w+)(?=
    ),這樣就能配置後邊是換行的一段字元串,AAAAAA後邊是空格的就匹配不上了。
  2. 將名字(name)裡邊的第一個數字替換成描述後邊最後一段字元串。就需要用到g<X>了。以前想到的還是先都匹配出來,再批量替換。現在不用了。
  3. 但是替換時還出現了一點問題。因為只想替換名字後邊的數字,但是又需要找到描述後邊的字元串,那麼就需要將中間那部分匹配出來,然後再放回去。。g<3>_g<2>g<3> 這裡邊g<3>就是最後的(w+), g<2>就是不想動的(d+.*?description.*?)。(好像g<0>是匹配到的所有字元串,但是沒試過)
  4. 剛開始忘了給count這個參數,就是0那個位置,結果每次只能替換前16項……
  5. (d+.*?description.*?) 這裡邊想找到數字後邊的第一個description之間的內容,要用 .*? ,如果用 .* 就會匹配數字後邊到最後一個description所有內容了。

推薦閱讀:

好文配好圖:正則表達式RegExp
Go語言中使用正則提取匹配的字元串
正則表達式及其簡單應用-前端筆記

TAG:Python | 正則表達式 |