PHP和Python正則詳解

規則:匹配到就會結束:
+ 匹配此表達式 一次或多次;

字符:
{n} 匹配前面字符串的個數
{n,} 至少n個
{n,m}n- m個
{^xy} 補集 不含 xy

\d 0-9的數字:
\D 補集 非數字;
\w 大小寫字母數字 下劃線;
\W 補集
\b 單詞的開始或結束;

下面轉自某 博客專家:

一.正則表達式
1.匹配符
1)頭匹配符"":如0754,只匹配開頭爲0754的字符串
2)尾匹配符"":0754":如0754,只匹配結尾爲0754的字符串
3)全字匹配:將^和,0754結合,如^0754,匹配0754字符串
2.轉義字符
1)空字符:
換行\n
回車\r
製表符\t
2)其他字符:
“$” $
“^” ^
“+” +
“/” /
3.通配符
1)號:用來匹配前面一個字符是否在字符串中出現零次或多次.
例1:'abc
’,匹配含有ab的所有字符串。
2)+號:…一次或多次.
例2:‘abc+’,匹配含有abc的所有字符串。
3)?號:…零次或一次.
例3:只匹配含有ab、abc結尾不再含c的字符串。如abca,aabc,aaab都可以,但abcc就不行。
4.關於轉義字符$與雙、單引號(php4環境)
1)正則表達式本身就是一個字符串。
2)當引號中含有(1)使(時,用雙、單引號定義就有區別,區別如下: (1)使用單引號定義時,解釋器會把引號內所有字符(包括在內)都原封不動的賦值給字符串變量。
(2)使用雙引號定義時,解釋器會把引號內""()""字符以及其後的合法字符(字母、數字、下劃線)翻譯成變量,直到遇到一個非法字符才認爲變量名結束,該非法字符及其後面的字符都被視爲一般字符賦給字符串變量,直到遇到下一個"“爲止。
(3)注意:單個KaTeX parse error: Undefined control sequence: \, at position 47: …將其翻譯成變量。也不需要加轉義\̲,̲當然不提倡。 …,就無法用雙引號來定義這個正則表達式,原因是轉義字符$在單,雙引號中表示的意義不同:
<1>雙引號中,$和單個的$意義是一樣的,都是代表尾匹配符,因此c$$=c$=c$$=c$=c$$;雙引號中,$在任何時刻都只代表一個字符”$",echo “c$"c"結果是c$,並且$和單個的((單個的是指該)"無法和其後字符組成變量名)是完全等效的,都是尾匹配符,所以雙引號中是無法寫入作爲非尾匹配字符的字符""的,也正是這個原因,大多數需要匹配$時定義正則表達式只能用’’。
<2>單引號中,$的意義僅僅表示字符”"",尾匹配符是,不管後面是否有合法變量名字符;單引號中,$其實是兩個字符,如不用於正則匹配將沒有任何意義,echo 'c$$'結果仍是c$$。單作爲正則表達式來使用,單引號中的$表示的是特殊字符""",而尾匹配符就是單獨的字符。
3)正則表達式的尾匹配符""1ab"和變量的定義符是相同的: 例1:定義正則表達式爲^ab:$pattern="^ab$";轉義字符$在雙引號中就表示字符ab,結果是^ab
例2:如上題,使用pattern="abpattern="^ab";顯然是錯誤的,但是由於3c在尾部,後面沒有其他字符,所以依然適用。 例3:以字符組合c結尾的正則表達式:$pattern='c$;4'; 例4:如上題,pattern=“c$$”;正則表達式將$視爲尾匹配符,故只匹配以c結尾。

5."[]“方括號(字符簇)用法
1)[]匹配一個字符,在[]中使用^開頭表示取非,即其後的字符全部是不匹配的。
例1:[a-zA-Z0-9]匹配所有大小寫字母和數字。
例2:[\n\t\r\f]匹配所有空字符。
例3:[^A-Z]不匹配大寫字母。
例4:[0-9]匹配不以數字開頭的字符或字符串
2)特殊字符”."(句點)匹配除了"新行"之外的所有字符,模式^.abcabc"."""1.abc匹配任何以abc結尾的字符,但是不能匹配其本身。模式"."則可以匹配任何字符串,除了空字符串和只有一個"新行"字符的字符串。 例1:'^.abc’;匹配所有尾部含有abc的字符串,不匹配小數(新行),當不匹配abc。
例2:’.’;匹配所有字符串,但不匹配空值。
例3:’.abc’;匹配所有含abc的字符串,小數等等都可以,前提是不以abc爲首,不匹配abc。
例4:’.abcabcabc3)php[[:alpha:]][[:digit:]][[:alnum:]][[:space:]][[:upper:]][[:lower:]][[:punct:]][[:xdigit:]][[:cntrl:]]ASCII326.""1)nnm,nm nmnn,nn1:a10';匹配所有以abc結尾的字符串,任何小數等等都可以,不匹配abc。 3)php提供了內置通用字符簇: [[:alpha:]]任何字母 [[:digit:]]任何數字 [[:alnum:]]任何字母和數字 [[:space:]]任何空白字符 [[:upper:]]任何大寫字母 [[:lower:]]任何小寫字母 [[:punct:]]任何表點符號 [[:xdigit:]]任何十六進制數字 [[:cntrl:]]任何ASCII值小於32的字符 注意:以上字符簇有個特點,只要被匹配的字符或字符串中有此字符,即匹配正確,不管字符串是以什麼方式組成的。 6."{}"大括號用法 1)方括號只能匹配一個字符,而匹配多個字符只能用{}實現:{}用來確定前面內容出現的次數。{n}表示出現n次;{m,n}表示出現m~n次,包括m和n次;{n,}表示出現n次或者n次以上。 例1:^a{10};匹配aaaaaaaaaa。
例2:[0-9]{1,};>02)""?0,1.....0,+.....1,7."()""()"pattern;匹配所有>0的數。 2)"{}"與通配符之間的關係 ? 相當於 {0,1} 零次或一次 * ..... {0,} 零次或無數次 + ..... {1,} 一次或無數次 7."()"用法 圓括號"()"括住的pattern表示子模式,如pattern=’([1-9]{1}[0-9]{3})-([0-1]{1}[1-2]{1})-([0-3]{1}([0-9]|))’?)擴住的就是一個個子模式,()相當於把他們獨立起來,分別匹配而相互不干擾。
二.POSIX風格正則表達式函數
1.ereg
ereg(pattern,string,[array $regs]);
eregi(pattern,string,[array regs]);eregstring滿patterntruefalseregs]); ereg函數在string中找到滿足pattern模式的文本,如果找到true,沒找到false。如果有第三個參數regs,那找到的文本將放在regs[0]regsregs[0]中,並且regs數組中將一次存放各個圓括號表達的子模式匹配的結果。regs[1]中存放了第一個子模式所匹配的結果,regs[2]regs[2]中是第二個,順序從左到右,依次類推。如果沒有找到匹配的文本,regs數組的值不會被改變。
注意:如果找到了匹配的文本,不管找到的子模式是多少個>9還是<9,ereg()只會改變regs10eregfalsetrueregs數組前10個元素的值。但是這不會影響函數對子模式組合的匹配結果。ereg總是先匹配完,如果沒發現匹配的文本就false,發現了就true。如果有子模式,會逐步根據這些子模式重新在字符串中尋找匹配的文本,直到regs數組被填滿10個元素或者所有子模式被匹配完,如果子模式少於10則剩餘的regsregs將被賦空值。總之一句話,匹配歸匹配,regs歸regsregs,regs只有10個值。
eregi()函數與ereg()基本用法相同,只是eregi對大小寫不敏感。
2.ereg_replace和eregi_replace
ereg_replace(pattern,string replacement,string)
eregi_replace(pattern,string replacement,string)
string字串中滿足pattern的文本將被替換成replacement。如果string中有pattern匹配的文本,那麼返回替換之後的值,如果沒有,則返回原來的string值。
如果pattern中包含子模式,子模式可以有選擇的被保留而不被替換。
例1:pattern中的第二個子模式不被替換,replacement可寫成這樣:replacement\2。這樣string中匹配的pattern的字符串將被替換爲replacement+pattern2,pattern2表示匹配pattern的文本中又匹配pattern的第二個子模式的文本。如果使用"\0"表示保留整個匹配文本。利用這個特性可以實現在特定的字符串之後插入文本的操作。
replacement必須是字符串類型變量,如果不是,替換時將強制轉換成字符串類型。
3.split()函數和spliti()函數用法
split(pattern,string,[int limit]);
spliti(pattern,string,[int limit]);
split以正則表達式pattern定義的模式爲分隔符將string分隔成幾個部分。如果分隔成功,返回的值爲各個分隔後部分組成的數組,失敗則返回false。可選limit表示最大分割塊數。如果limit爲5,那麼即使string有>5個的地方符合pattern,string也只被分割爲5個部分,最後一個部分是string去掉前四個部分後剩下的部分。返回值中也只有5個元素。
三.perl風格正則表達式及相關函數
1.perl正則語法
perl分隔符,可使用"/","!“和”{}"。
例1:/[0-9]/ !1! {2}三個都一樣。
在分隔符內部,分隔字符本身就是一個特殊敏感字符,要進行轉義。如果用分隔符"/",正則中又用了表達字符的"/",則必須要用"/"。如果混合用"/“和”!“就沒問題。
例2:////!/// !//! 兩者也相同
例3:!^!![0-9]!/!![09]! /^!![0-9]/ 兩者也相同
2.perl特殊意義字符
\a ASCII值爲7的告警符
\b 詞的邊界
\A 和脫出符號(”/")等價
\B 非詞邊界
\cn 控制字符
\d 單個數字
\D 單個非數字
\s 單個空白
\S 單個非空白
\w 單個的字母或下劃線
\W 單個的非詞字符(不是字母也不是下劃線)
\Z 從目標字串的尾部開始匹配
3.高級特性
1)或運算"|":
例如!ex|em!匹配條件是ex或em開頭的字符串,還可以寫成!e(x|m)!。
注意:()內的內容代表子模式
2)邏輯符號後面的模式選項
!正則表達式!邏輯選項
A:只匹配位於目標字串開頭的字符。
E:該選項使轉義字符mU/a+/"caaaaab""aaaaa"使/a+/U"a"Sim"構成的正則表達式只匹配目標字符串的結尾字符。如果選擇m選項,該選項就被忽略。 U:該選項禁止最大長度的搜索。一般情況下,搜索會盡量找最長的匹配字符串。例如模式/a+/在"caaaaab"字符串中的匹配結果是"aaaaa",但是使用該選項的模式/a+/U匹配的結果會是"a"。 S:對模式進行學習,提高查找速度。 i:該選項忽略大小寫。 m:該選項將含有換行符的字符串視爲多行而不是一行。這個時候"","^“等字符會匹配每個換行符。
s:該選項使句點”.“也匹配換行符。
x:該選項通知PHP解釋器在分析的時候忽略正則表達式定義中的非轉義空格符。這樣可以在正則表達式中使用空格來增強其可讀性,但這時在表達式中使用空格符必須使用轉義字符。
3)擴展模式符號。
(?#comment) 添加註釋comment,可以增強正則可讀性。
(?=pattern) 指定在模式之後必須跟隨值pattern。
(?!pattern) 指定在模式之後不能跟隨值pattern。
(?n) 在模式內部而非結尾處定義模式選項n。
(?: ) 消耗字符,不捕獲匹配結果。
例:echo ereg(”?:^a$",“a”);//無任何輸出。

4.per正則函數
1.preg_grep函數
preg_grep(pattern,array input);
輸入數組input中尋找匹配模式pattern的字串,並將所有的匹配字符串返回。返回值就是所有匹配的字符串組成的數組。
2.preg_match函數
preg_match(pattern,string subject,[array matches])
該函數在subject字符串中尋找匹配pattern的字符串。如果找到則返回一個非零值,否則返回零值。如果選用了可選項matches,那麼匹配的字符串將被放到第一個元素的位置,可以用matches[0]matches[0]來讀取,圓括號匹配的結果也按順序放在這個數組中,第一個是matches[1],第二個是$matches[2],依次類推。
3.preg_match_all函數
preg_match_all(pattern,subject,array matches,[int order])
該函數在subject字符串中尋找匹配pattern的互不重疊的文本,找到了匹配的文本則返回匹配文本的個數,否則返回0。匹配文本被放在二維數組matches中,matches[0]中存放的是所有符合的字符串。各種嵌入的子模式匹配的結果依次放在數組matches[1]~[n]中。
order參數可選,可取的值爲PREG_PATTERN_ORDER和PREG_SET_ORDER。
4.preg_replace函數
preg_replace(pattern,replacement,subject,[int limit])
該函數將subject中符合pattern模式的部分替換成replacement,返回值類型和subject類型一樣,如果有替換,則返回替換後的值,反之則返回原來的值。
參數可以是數組也可以是變量,有幾種情況:
<1>如果subject參數是數組類型。函數對每一個數組元素進行替換操作;
<2>如果pattern是數組則函數根據每一個pattern中的類型進行替換;
<3>如果pattern和replacement都是數組,則按兩個數組中的元素對應完成替換;
<4>如果replacement中的元素個數少於pattern中的元素個數。那麼不夠的部分將有空字符串來代替。
5.preg_split函數
preg_split(pattern,subject,[int limit][flages])
該函數以pattern定義的模式爲分隔符將subject字符串分隔爲若干個部分,返回數組,其中存放被分隔後的字符串。limit可限制返回字符串的數目,如果設置爲-1表示對返回的字符串數目不加任何限制。flags也是可選項,其有兩個值:PREG_SPLIT_NO_EMPTY設定函數不返回空字符串,PERG_SPLIT_DELIM_CAPTURE,該選項設定pattern中的嵌入子模式也會被函數匹配。

Python 正則:
HTML

1
<a href="/films/1203" title=“霸王別姬” class=“image-link”

在這裏插入圖片描述
正則表達式:
pattern=re.compile(
匹配以

開頭一次或多次
"
.*?

匹配以board-index一次或多次
board-index.*?

匹配 數字 0-9 一次或多次加
(\d*).*?

(下面基本一樣)
data-src="(.?)".?
class=“name”.?
title="(.
?)".?
class=“star”>(.
?)

.*? releasetime">(.*?) .*? class="integer">(.*?) .*? 匹配 數字 0-9 fraction">(\d).*? ",re.S)

正則表達式:

pattern=re.compile("<dd>.*?board-index.*?
(\d*)</i>.*?data-
src="(.*?)".*?
class="name".*?
title="(.*?)".*?class="star">(.*?)
</p>.*?releasetime">(.*?)
</p>.*?class="integer">(.*?)
</i>.*?fraction">(\d)
</i>.*?</dd>",re.S)

re.compile() 函數

編譯正則表達式模式,返回一個對象。可以把常用的正則表達式編譯成正則表達式對象,方便後續調用及提高效率。

re.compile(pattern, flags=0)
pattern 指定編譯時的表達式字符串
flags 編譯標誌位,用來修改正則表達式的匹配方式。支持 re.L|re.M 同時匹配
flags 標誌位參數

re.I(re.IGNORECASE)
使匹配對大小寫不敏感

re.L(re.LOCAL)
做本地化識別(locale-aware)匹配

re.M(re.MULTILINE)
多行匹配,影響 ^ 和 $

re.S(re.DOTALL)
使 . 匹配包括換行在內的所有字符

re.U(re.UNICODE)
根據Unicode字符集解析字符。這個標誌影響 \w, \W, \b, \B.

re.X(re.VERBOSE)
該標誌通過給予你更靈活的格式以便你將正則表達式寫得更易於理解。
報錯信息:
在這裏插入圖片描述
<可深入追問>
7. 正則表達式(語言操作)
文本信息:
問:什麼是正則表達式?爲什麼報錯了?正則表達式原本是想要提取什麼

現在解答一下:
在這裏插入圖片描述
你就這樣 每次複製一點點進去 ,現在沒報錯正常打印,看複製到哪一句報錯就是哪部分的原因。
代碼給你

import re
content = 'Citizen wang , always fall in love with neighbour,WANG'
rr = re.compile("<dd>.*?board-index.*? ",re.S) # 不區分大小寫
print(type(rr))
a = rr.findall(content)
print(type(a))
print(a)

參考:


  1. 0-9 ↩︎

  2. 0-9 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章