正規表示式,又稱規則表示式。(英語:regular下面是我自己學習的一些總結。這個真的有毒,前段時間學的,最近過年好久沒碰又忘了,想想還是寫一篇筆記記錄一下expression,在**中常簡寫為regex、regexp或re),電腦科學的乙個概念。正規表示式通常被用來檢索、替換那些符合某個模式(規則)的文字。
元字元
. 匹配除換行符外的任意字元
\w匹配字母數字下劃線中文
\s匹配空格
\d匹配數字
^匹配字串的開始
$匹配字串的結束
上段**
s ="2222efr43243dsfg4r)_+"
reg1 ="\d" # 匹配全部數字
reg2 ="^\d" # 匹配開頭的數字
print(re.findall(reg2, s))
反義字元:
說白了就是元字元反過來就好了,可以一起記
. 匹配除換行符外的任意字元
\w 匹配非字母數字下劃線中文
\s 匹配非空格
\d 匹配非數字
限定符
*重複0次到多次
+重複1次到多次
?重複0次到多次
重複n次
重複n次到多次
重複m次到n次
分組匹配1,search:search返回的是乙個匹配物件 ,呼叫物件的group方法獲得字串
s =「my qq is 189334423,my post code is 33332」
reg4 ="(\d.*(\d))"
print(re.search(reg4, s))
group裡面為空或者為1,返回的結果是一樣的
print(re.search(reg4, s).group())
print(re.search(reg4, s).group(1))
print(re.search(reg4, s).group(2))
2, match:匹配開頭
s =「hellohello」
reg5 =「hello」
print(re.match(reg5, s,re.i).group())
總結:
findall匹配所有
match匹配開頭(必須出現在字串第乙個位置)
search匹配第乙個(可以出現任意位置,只要是第乙個就好)
貪婪與非貪婪
貪婪:盡可能多的匹配
非貪婪:盡可能少的匹配
非貪婪符可以用在*,?,+的後面
*? 重複1次
?? 重複0次
+? 重複0次
**如下:
s =「greedyaiiii」
reg1 =「greedyai*」 # 貪婪
print(re.findall(reg1, s)) # 非貪婪
reg2 =「greedyai*?」
print(re.findall(reg2, s))
執行結果為:
[『greedyaiiii』]
[『greedya』]
分支條件匹配**如下:
s =「my phone num=010-11111111 0599-2222222 020-2222222」
reg3 =「0\d-\d|0\d-\d|0\d-\d」
print(re.findall(reg3, s))
執行結果為:
[『010-11111111』, 『0599-2222222』, 『020-2222222』]
捕捉與非捕捉(?:)
非捕捉:不破壞正規表示式的整體性,匹配全部
捕捉:捕捉連續符合正規表示式組內的最後乙個組的內容
現在我們有個需求,需要匹配ip位址
正常情況下,我們這麼寫可以匹配出來
ip ="address code: 128.0.0.1 125.125.125.125 0.0.0.0"
reg4 ="(\d\.)\d"
print(re.findall(reg4, ip))
但是,這裡實際的執行結果為 [『0.』, 『125.』, 『0.』]
原因是當分組時,會自動匹配捕捉模式,捕捉是是連續符合正規表示式組內的最後乙個組的內容,所以這邊匹配的就是每組的第三個
這個時候我們需要用到不捕捉,關鍵字就是 ?:
ip = "address code: 128.0.0.1 125.125.125.125 0.0.0.0"
reg4 = "(?:\d\.)\d"
print(re.findall(reg4, ip))
這樣得出的結果就是:[『128.0.0.1』, 『125.125.125.125』, 『0.0.0.0』]
還有個例子如下:
print(re.findall(reg5, address))零寬斷言
(?=reg) 匹配reg前面的內容
(?<=reg) 匹配reg後面的內容
(?!reg) 匹配後面跟的不是reg的內容
(?例子如下:
s1 ="hellogreedyailove"
reg6 ="helo(?=greedyai)"
print(re.findall(reg6, s1))
這裡匹配的就是greedyai前面的內容,故結果就是hello
reg7="(?<=greedyai)[a-z]*"
print(re.findall(reg7, s1))
這裡匹配的就是greedyai後面的內容,故結果就是hello
reg8="lo(?!greedyai)"
print(re.findall(reg8, s1))
這裡返回的是love裡面的lo,因為匹配的是後面跟著的不是greedyai的內容,前面hello裡的lo後接greedyai
reg9 ="(?
print(re.findall(reg9, s1))
返回的是hello的2個l,因為這裡返回的是l前面不是greedyai的內容,那love裡的l就被排除了 正規表示式 正則入門
先從乙個例子開始正規表示式。書寫乙個匹配手機號的正規表示式,為了方便討論,假定手機號是1開頭,第二位只能是3 5 8中的其中乙個,總共11位的數字,形如13 匹配手機號的正規表示式為 1 358 d 下面介紹此正規表示式中的各個符號的含義。表示字串的開頭,後面緊接著1,表示匹配的字串要以 1 開頭。...
正規表示式入門
對於文字字元,有11個字元被保留作特殊用途。他們是 這些特殊字元也被稱作元字元 不可顯示字元 可以使用特殊字串行來代表某些不可顯示字元 代表tab 0x09 代表回車符 0x0d 代表換行符 0x0a 字符集 字符集是由一對方括號 括起來的字元集合。使用字符集,你可以告訴正規表示式引擎僅僅匹配多個字...
正規表示式入門
老師說過 正規表示式就是用字串讀取字串!學習正規表示式的最好方法是從例子開始,理解例子之後再自己對例子進行修改,實驗。下面給出了不少簡單的例子,並對它們作了詳細的說明。假設你在一篇英文 裡查詢hi,你可以使用正規表示式hi。這幾乎是最簡單的正規表示式了,它可以精確匹配這樣的字串 由兩個字元組成,前乙...