1. 程式人生 > >Python正則表示式--每日一點 檢索和替換

Python正則表示式--每日一點 檢索和替換

簡單的對上期的search和match進行一下簡單補充,兩者最大的區別在於match是從開始部分進行匹配,沒有匹配到就返回空,而search是整句掃描進行匹配

好了,開始今天的內容

大家看下這段程式碼

    patter1 = '#.*$'  # 刪除註釋的正則表示式
    patter2 = '\D'  # 刪除非數字的正則表示式
    source = "15527%051_13-2 #這是電話"
    print(source)
    result = re.sub(patter1, '', source)  # 把註解刪掉
    print(result)
    result2 = re.sub(patter2, ''
, result) # 把非數字的刪掉 print(result2) # 控制檯打印出來的結果為: #15527%051_13-2 #這是電話 #15527%051_13-2 #15527051132

分析這個sub方法的引數問題

    '''
    下面有四個引數
    1 pattern 很明顯是匹配規則
    2 repl是替換的字串
    3 string 需要處理的字串
    4 count是表示匹配後替換的個數,一般是0,表示把匹配到的全部給替換掉,一般不寫
    5 這個是標誌位,是否忽視大小寫等等之類的
    # re.sub(pattern, repl, string, count=0 , flag=None)
    '''
``` ## 在看下下面的程式碼 ```python inputStr = "hello python,ni hao c,zai jian python" replaceStr = re.sub(r"hello (\w+),ni hao (\w+),zai jian \1", "PHP", inputStr) print(replaceStr) inputStr = "hello python,ni hao c,zai jian python" replaceStr = re.sub(r"hello (\w+),ni hao (\w+),zai jian \2"
, "PHP", inputStr) print(replaceStr) #列印結果 #PHP #hello python,ni hao c,zai jian python <div class="se-preview-section-delimiter"></div>

為什麼會產生這樣的結果呢,我們逐一的分析下

  • 用 PHP來代替 hello (\w+),ni hao (\w+),zai jian \1匹配到的內容 ,當然全部匹配到了,所以返回PHP
    \1 表示取第一個分組匹配到的內容,也就是python這個字串作為匹配格式,放到\1這個位置進行匹配,python剛好匹配到了python。如果換成\2的話就是,C匹配python,肯定匹配不成功,如果是這樣的話就會返回原來的字串,就如同第二個例子

使用函式來處理匹配

這裡寫程式碼片
> 為什麼會產生這樣的結果呢,我們逐一的分析下

- 用 PHP來代替 hello (\w+),ni hao (\w+),zai jian \1匹配到的內容 ,當然全部匹配到了,所以返回PHP
 \1 表示取第一個分組匹配到的內容,也就是python這個字串作為匹配格式,放到\1這個位置進行匹配,python剛好匹配到了python。如果換成\2的話就是,C匹配python,肯定匹配不成功,如果是這樣的話就會返回原來的字串,就如同第二個例子


## 使用函式來處理匹配

```python
def pythonReSubDemo():

    # 源字串
    inputStr = "hello 123 world 456"

    def _add111(matched):
        print("執行----")
        intStr = matched.group("number") #123
        intValue = int(intStr)
        addedValue = intValue + 111 #234
        addedValueStr = str(addedValue)
        return addedValueStr

    replacedStr = re.sub("(?P<number>\d+)", _add111, inputStr)
    print("replacedStr=", replacedStr) #hello 234 world 567
    '''
        (?P<number>\d+)這個是分組,然後在指定一個額外的別名,也就是number 在上面就有獲取這個分組
    '''
    # 控制檯列印的結果為
    #執行----
    #執行----
    #replacedStr= hello 234 world 567

從上面控制檯列印的結果來看,_add111這個方法是執行了兩次。
replacedStr = re.sub(“(?P\d+)”, _add111, inputStr)在這個匹配中對匹配的進行分組命名為number 每匹配到一次就執行 _add111這個方法,然後通過分組名來拿到指定的匹配值 return 返回後就進行替換了