匹配優先:盡可能多的匹配
忽略優先:盡可能少的匹配
我們剛開始接觸的都是匹配優先:
* + ?
忽略優先只需要在原本的匹配優先量詞後加乙個問號即可:
*? +? ?? ?
要注意的是,dfa不支援忽略優先。來看下面兩個例子:
匹配優先:
忽略優先:
原因是什麼呢?上面說過,匹配優先總是盡可能多的匹配,所以『\w+』先匹配所有的文字,然後為了匹配『a』,『\w+』需要交還乙個字元,看是否能匹配『a』,發現不能匹配,然後繼續交還字元,直到能匹配『a』為止,如果所有的字元都交還完後還是不能匹配,報告匹配失敗。
而對於忽略優先,總是匹配盡可能少的字元,因為量詞『+』最少匹配乙個字元,所以『\w+?』,先匹配『1』,看後面的字元能否匹配『a』,如果不能,『\w+?』會繼續匹配『2』,看後面的字元能否匹配『a』,直到能匹配『a』或嘗試所有可能後報告匹配失敗。
這兩個例子中捕獲括號裡捕獲的是哪個部分呢?是『123』還是『3』?
結果:
其實也不難理解,因為『\w+』是匹配優先的,所以先會全部匹配,然後交還乙個字元『3』,這是『\d+』正好能匹配,匹配成功。
而對於忽略優先,『\w+?』會先匹配『a』,這時『\d+』無法匹配後面的部分,所以『\w+?』會再多匹配乙個字元,這是『\d+』還是無法匹配後面的部分,然後『\w+?』繼續多匹配乙個字元,此時它匹配的是『abc』,而『\d+』則正好能匹配後面的『123』,匹配成功。
關於匹配優先可能會遇到的問題及解決方法請看這裡這個例子
精通正規表示式之匹配優先與忽略優先
匹配優先 盡可能多的匹配 忽略優先 盡可能少的匹配 忽略優先只需要在原本的匹配優先量詞後加乙個問號即可,即在 一類字尾元字元後加入?即可 要注意的是,dfa不支援忽略優先。最近在工作當中在使用乙個正規表示式的時候遇到了乙個問題,用如下正規表示式匹配乙個字串的時候,沒有匹配出我想要的效果。匹配優先正規...
正規表示式05 匹配開頭結尾
字元功能 匹配字串開頭 匹配字串結尾 coding utf 8 import re email list xiaowang 163.com xiaowang 163.comheihei com.xiaowang qq.com for email in email list ret re.match ...
正規表示式菜鳥教程6匹配規則
一切從最基本的開始。模式,是正規表示式最基本的元素,它們是一組描述字串特徵的字元。模式可以很簡單,由普通的字串組成,也可以非常複雜,往往用特殊的字元表示乙個範圍內的字元 重複出現,或表示上下文。例如 once這個模式包含乙個特殊的字元 表示該模式只匹配那些以once開頭的字串。例如該模式與字串 on...