環視只是進行子表達式的匹配,並不佔字符,匹配到的內容不保存,所以也叫作零寬斷言,環視最終的匹配結果就是一個位置。python
環視按照方向能夠分爲順序環視和逆序環視兩種,按是否進行匹配分爲確定和否認兩種,組合起來就是四種模式。express
環視表達式 | 解釋 |
---|---|
(?=expression) | 順序確定環視,表示所在位置右側能匹配expression |
(?!rexpression) | 順序否認環視,表示所在位置右側不匹配expression |
(?<=expression) | 逆序確定環視,表示所在位置左側能匹配expression |
(?<!expression) | 逆序否認環視,表示所在位置左側不匹配expression |
只說概念可能有些抽象,分別舉例子來演示一下具體的使用場景。markdown
# s = 'xiaomi9iphone8iphone7',須要在每一個手機型號後面加上逗號,變成 s= 'xiaomi9,iphone8,iphone7'
import re
print(re.sub(r'(?=iphone)',',',s))
# 順序確定環視,所肯定的位置右邊是字符串iPhone,在此位置便可添加逗號
複製代碼
# s = 'Takes Reservations:No Delivery:No Take-out:Yes Accepts Credit Cards:Yes Good for Groups:No'
# 需求是要在Yes,和No的後面加上逗號,使之變成
# s = 'Takes Reservations:No, Delivery:No, Take-out:Yes, Accepts Credit Cards:Yes, Good for Groups:No'
import re
re.sub(r"(?<=(No))(?=(\s+))|(?<=(Yes))(?=(\s+))",',',s)
# 逆序確定環視,所要肯定的位左邊必須能匹配上No,或者Yes
複製代碼
# s = '123aaa',將s字符串變成 s='123,a,a,a,'
# 分析一下,就是在字符串右側非數字的位置,添加逗號,即便用順序否認環視,匹配右側非數字位置
s = '123aaa'
re.sub(r'(?!\d+)',',',s)
複製代碼
# 將 s= 'aaa123'變成 s= ',a,a,a,123'
# 分析一下,就是在非數字左側的位置加逗號,使用逆序否認環視,匹配左側非數字的位置
s= 'aaa123'
re.sub(r'(?<!\d)',',',b)
複製代碼
有些例子不是很合理,儘可能能表達清楚環視的含義便可。iphone
總結:spa
環視的功能很是強大,也是正則中的一個難點,對於環視的理解,能夠從應用和原理兩個角度理解,若是想理解得更清晰、深刻一些,仍是從原理的角度理解好一些,正則匹配基本原理參考 NFA引擎匹配原理
複製代碼