1. 程式人生 > >爬蟲前提——正則表達式語法以及在Python中的使用

爬蟲前提——正則表達式語法以及在Python中的使用

通過 轉義字符 之間 表達 斜杠 轉移 可能 對象 也會

正則表達式是用來處理字符串的強大工具,他並不是某種編程雲。

正則表達式擁有獨立的承受力引擎,不管什麽編程語言,正則表達式的語法都是一樣的。

正則表達式的匹配過程

1.一次拿出表達式和文本中的字符比較。

2.如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。

3.如果表達式中有兩次或便捷,這個過程會稍微有一些不同。

下面舉例一些符號

[....] 

字符集(字符類)。對應的位置可以是字符集中任意字符。字符集中的字符可以豬哥列出,也可以給出範圍,如[abc]或[a-c]。第一個字符如果是^則表示取反,如果[^abc]表示不是abc的其他字符。所有的特殊字符在字符集中都是去某原有的特殊含義。在字符集中如果是用]、-或^,可以在前面加上轉移字符反斜杠\,或把]、-放在第一個字符,把^放在非第一個字符。

預定義字符集(可以寫在字符集[....]中):

\d  數字:[0-9]

\D  非數字:[^\d]

\s  空白符:[<空格>\t\r\n\f\v]

\S  非空白符:[^\s]

\w  單詞字符:[A-Za-z0-9_]

\W  飛單詞字符:[^\w]

數量詞(用在字符或(...)之後)

*  匹配前一個字符0或無限次

+  匹配前一個次1次或無限次

?  匹配前一個次0次或1次

{m}  匹配前一個字符m次

{m,n}  匹配前一個字符m至n次(多於n次則失敗)

    m和n可以省略:若省略m,則匹配0至n次;若省略n,則匹配m至無限次

邊界匹配(不消耗待匹配字符串中的字符)

^  匹配字符串開頭。在多行模式中匹配每一行的開頭。

$  匹配字符串末尾。在多行模時匹配每一行的末尾。

\A  僅匹配字符串開頭。

\Z  僅匹配字符串末尾。

\b  匹配\w和\W之間

\B  [^\B]

邏輯、分組:

|  代表左右表達式任意匹配一個。(類比於C語言的或語句,它總是先匹配左邊的表達式,一旦成功匹配則跳過匹配右邊的表達式。如果|沒有被包括在()中,則它的範圍是整個正則表達式。)

(...)  被括起來的表達式將作為分組,從表達式左邊開始沒遇到一個分組的左括號‘(‘,編號+1.另外,分數表達式作為一個整體,可以後街數量詞。表達式中僅在該組中有效。

(?P<name>...)  分組,除了原有的編號外再指定一個額外的別名。

\<number>  引用編號為<number>分組匹配到的字符串。

(?P=name)  引用別名為<name>的分組匹配到的字符串。

特殊構造(不作為分組):

(?:...)  (...)的不分組版本,用於食用‘|‘或後接數量詞。

(?iLmsux)  iLmsux的每個字符代表一個匹配模式,只能用在正則表達式的開頭,可選多個。

(?#...)  #後的內容將作為註釋被忽略。

(?=...)  之後的字符串內容需要匹配表達式才能成功匹配。不消耗字符串內容。

(?!...)  之後的字符串內容需要不匹配表達式才能成功匹配。不消耗字符串。

(?<=...)  之前的字符串內容需要匹配表達式才能成功匹配。不消耗字符串內容。

(?<!...)  之前的字符串內容需要不匹配表達式才能成功匹配。不消耗字符串內容。

(?(id/name)yes-pattern|no-pattern)  如果編號為id/別名為name的組匹配到字符串,則需要匹配yes-pattern,否則需要匹配no-=attern。[no-pattern]可省略。

數量詞的貪婪模式與非貪婪模式

正則表達式通常用於在文本中查找匹配的字符串。

貪婪模式:總是嘗試撇皮盡可能多的字符;(Python裏數量詞默認是貪婪的)

非貪婪模式:總是嘗試匹配盡可能少的字符。(在貪婪模式的*或+後加上?,就變成了非貪婪模式)

python中如何使用正則表達式

python中是通過一個叫"re"的包來支持正則表達式。

技術分享圖片

結果如下:

技術分享圖片

我們來分析一下pattern = re.compile(r‘\d+\.\d*‘) 這個語句:

\d表示數字[0-9]

+表示重復出現上一次匹配的1次或n次

\.表示字符‘.’

*表示重復出現上一次匹配的0次或n次

r實際上是python告訴編譯器這個字符串中的全部轉義字符失效,按照原始字符串處理。

所以\d+.\d*實際上是表示匹配一些小數的規則。然而這個表達式並不能正確匹配所有的小數,比如‘0.‘這樣的字符也會被匹配,舉這個例子純粹是為了多講幾個符號。

由於我們已經建立好了一個能夠匹配‘\d+.\d*‘規則的pattern對象。

通過pattern的findall方法就能夠匹配到我們想要的字符串。

返回的是一個字符串列表[]。

爬蟲前提——正則表達式語法以及在Python中的使用