1. 程式人生 > >【Python內建包】re.sub功能

【Python內建包】re.sub功能

之前要用到正則替換,所以就用到了sub這個功能,看著doc裡寫的雲裡霧裡的,就自己做了做實驗

re.sub(pattern, repl, string, count=0, flags=0)
先說功能

Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement repl.

就是先去找到string之中可以匹配pattern的部分,然後將這些部分替換成repl
再看看引數情況
第一個引數pattern:就是正則式字串或者正則式物件
第二個引數repl:就是要用什麼東西去替換pattern匹配到的字串
第三個引數string:就是對哪個字串進行匹配與替換
第四個引數count:就是隻替換前幾個,如果是0則全部都替換
先來看python doc給的官方示例

>>>pattern = r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):'
...rep = r'static PyObject*\npy_\1(void)\n{'
...s = 'def myfunc():'
...re.sub(pattern, rep, s)
'static PyObject*\npy_myfunc(void)\n{'

可以看到的是,pattern 這個正則式,成功匹配了s這個字串,本應把這個字串全部替換為
“static PyObject*\npy_\1(void)\n{”

但我們發現\1的位置變成’myfunc’,這是為啥呢
因為在正則表示式的規範裡,每一對小括號都代表了一個組,從左往右數第一個括號裡的叫做第一組,第二個括號裡的內容叫做第二組。也就是說pattern這個正則式中,第一組是
“[a-zA-Z_][a-zA-Z_0-9]*”
並且只有第一組
因此在repl引數裡,‘\1’就代表著:pattern中第一組正則表示式匹配到的內容,也就是‘myfunc’
並且‘\1’這種用法在pattern裡面仍然可以用,我們看下一個例子

input="python,123,python"
output = re.sub(r"(\w+),(\d+),\1",r"rep",input)
print('output=\"'+output+'\"')
#output=rep

我們發現這個表示式匹配成功,並且把字串替換掉了,也就是說’\1’代表了‘(\w+)’的匹配內容,也就是‘python’

input="python,123,python"
output = re.sub(r"(\w+),(\d+),\2",r"rep",input)
print('output=\"'+output+'\"')
#output="python,123,python"

我們發現這個表示式匹配失敗,沒有把字串替換掉,因為’\2’代表了‘(\d+)’的匹配內容,也就是‘123’

input="python,123,123"
output = re.sub(r"(\w+),(\d+),\2",r"rep",input)
print('output=\"'+output+'\"')
#output="python,123,python"

我們發現這個表示式匹配成功,把字串替換掉了

承接pythondoc的例子我們再做一次實驗

input="python,123,123"
output = re.sub(r"(\w+),(\d+),\2",r"rep:\1,\2,\2,\1",input)
print('output=\"'+output+'\"')
#output="rep:python,123,123,python"