python正規表示式簡介

2021-08-11 14:36:50 字數 2479 閱讀 3836

之前未接觸過正規表示式,今日看python網路爬蟲的原始碼,裡面一行正規表示式匹配的**初看之下,不是很理解,**如下:

myitems = re.findall('(.*?)

',unicodepage,re.s)

「.*?」這種匹配方式,按理解應該是匹配任意字元0個或多個(re.s模式,「.」可以匹配「\n」),但是這個「?」總覺的在這兒是多餘的,既然不理解,就敲**試試:

import re

這個結果,應該說是意料之中,加個「?」呢?

import re

竟然是這個結果。。。「.

?」乙個字元都沒匹配,按「.」、「

」、「?」的匹配理解,也就是「*」「?」均匹配前面字元0次,才會是這個結果,可是為啥就是0次了? 

這就是正規表示式貪婪模式和非貪婪模式: 

貪婪模式,總是嘗試匹配盡可能多的字元; 

非貪婪模式則相反,總是嘗試匹配盡可能少的字元。 

python裡數量詞預設是貪婪的,這就解釋了第乙個匹配實驗,輸出結果為」www.baidu.com」(貪婪模式),也就是說第二個匹配實驗是非貪婪模式,僅僅因為加了「?」,繼續實驗

import re

此次匹配結果,顯然是貪婪模式。奇怪了,也就是「?」的特殊組合才是非貪婪模式。 

網上搜尋得如下說明: 

標準量詞修飾的子表示式,在可匹配可不匹配的情況下,總會先嘗試進行匹配,稱這種方式為匹配優先,或者貪婪模式。此前介紹的一些量詞,「」、「」、「」、「?」、「*」和「+」都是匹配優先的。 

一些nfa正則引擎支援忽略優先量詞,也就是在標準量詞後加乙個「?」,此時,在可匹配可不匹配的情況下,總會先忽略匹配,只有在由忽略優先量詞修飾的子表示式,必須進行匹配才能使整個表示式匹配成功時,才會進行匹配,稱這種方式為忽略優先,或者非貪婪模式。忽略優先量詞包括「?」、「?」、「?」、「??」、「*?」和「+?」。 

顯然「*?」的組合是非貪婪模式,猜想正確,原來如此啊。

還有就是, python   中字串前面加上 r 表示原生字串,與大多數程式語言相同,正規表示式裡使用  "\"  作為轉義字元,這就可能造成反斜槓困擾。假如你需要匹配文字中的字元  "\" ,那麼使用程式語言表示的正規表示式裡將需要4個反斜槓  "\\\\"  :前兩個和後兩個分別用於在程式語言裡轉義成反斜槓,轉換成兩個反斜槓後再在正規表示式裡轉義成乙個反斜槓。python裡的原生字串很好地解決了這個問題,這個例子中的正規表示式可以使用  r"\\"  表示。同樣,匹配乙個數字的  "\\d"  可以寫成  r"\d"  。有了原生字串,你再也不用擔心是不是漏寫了反斜槓,寫出來的表示式也更直觀。

\b   匹配乙個單詞邊界,也就是指單詞和空格間的位置。例如,「er\b」可以匹配「never」中的「er」,但不能匹配「verb」中的「er」。   \b   匹配非單詞邊界。「er\b」能匹配「verb」中的「er」,但不能匹配「never」中的「er」。

match()   函式只檢測re是不是在string的開始位置匹配, search() 會掃瞄整個 string 查詢匹配, 也就是說  match()  只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話, match()  就返回  none

python 正規表示式 簡介

1.正規表示式 描述字串排列的一套規則 2.可以使用正規表示式提取出所有滿足規則的字串 3.在python中使用re模組是實現在python正規表示式的功能 正規表示式的基礎知識 1.原子 2.元字元 3.模式修正 原子 原子是正規表示式中最基礎的組成單位,每個正規表示式中至少包含乙個原子 1.普通...

Python正規表示式簡介

作者 i n alghani khalid 編譯 vk towards datas science 假設你要根據給定的查詢搜尋某個內容。如果你只依靠乙個字串,你就得不到你想要的東西。那麼,如何在海量資訊中尋找你需要的東西呢?當然,你需要乙個模式來識別你想要查詢的字串。為此,我們可以使用正規表示式 r...

正規表示式簡介

乙個正規表示式就是乙個模式,由與文字進行匹配的字串行組成。正規表示式有著廣泛的應用 grep sed vim make等等,某些指令碼語言如perl等更是將正規表示式納入語言內部。正規表示式由原子和運算子組成。最簡單的原子是單個字元,如果乙個正規表示式由單個字元組成,則該字元必須出現在目標文字的某處...