Python正則表示式--每日一點 檢索和替換
阿新 • • 發佈:2019-01-23
簡單的對上期的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 返回後就進行替換了