1. 程式人生 > >python之正則模組Re

python之正則模組Re

正則表示式

正則表示式為高階的文字模式匹配,抽取,與/或文字形式的搜尋和替換功能提供了基礎。正則表示式是一些由字元和特殊符號組成的字串,它們描述了模式的重複或者表述多個字元。
在這裡插入圖片描述

轉義符\

在正則表示式中,有很多有特殊意義的是元字元,比如\n和\s等,如果要在正則中匹配正常的"\n"而不是"換行符"就需要對""進行轉義,變成’\’。

在python中,無論是正則表示式,還是待匹配的內容,都是以字串的形式出現的,在字串中\也有特殊的含義,本身還需要轉義。所以如果匹配一次"\n",字串中要寫成’\n’,那麼正則裡就要寫成"\\n",這樣就太麻煩了。這個時候我們就用到了r’\n’這個概念,此時的正則是r’\n’就可以了。
在這裡插入圖片描述

貪婪匹配

在滿足匹配時,匹配儘可能長的字串,預設情況下,採用貪婪匹配
在這裡插入圖片描述

分組()與或|[^]

(1)^[1-9]\d{13,16}[0-9x]$     #^以數字0-9開始, \d{13,16}重複13次到16次
                                $結束標誌
上面的表示式可以匹配一個正確的身份證號碼
 
(2)^[1-9]\d{14}(\d{2}[0-9x])?$     
#?重複0次或者1次,當是0次的時候是15位,是1的時候是18位
 
(3)^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
#表示先匹配[1-9]\d{16}[0-9x]如果沒有匹配上就匹配[1-9]\d{14} 

Re模組

在這裡插入圖片描述
match方法

只能從開始字串開始的地方進行匹配

#只從字串開始匹配,並且guoup才能找到
import re
m = re.match('luck', 'luck')
if m is not None:
    print(m.group())  #當返回的有物件,也就是說能夠匹配到物件,就會有結果,否則會丟擲異常

輸出:'luck’
感受一下不是從字串開始匹配,他就沒有返回值, print(m.group()) 也沒有輸出

import re
m = re.match('luck', 'luck')
if m is not None:
    print(m.group())

search方法
函式會在字串中查詢模式匹配,只會找到第一個匹配然後返回,一個包含匹配資訊的物件,該物件通過呼叫group()方法得到匹配的,如果字串沒有匹配,則報錯

import re
m = re.match('a', 'laucka')
if m is not None:
    print(m.group())

輸出的就只有一個a,雖然這裡面有兩個,但是,它就會只找出第一個就返回了,不會再繼續向下找,但是這個就不能使用match方法。

findall方法
它返回要匹配出的所有結果,有幾個就會匹配幾個,最終把所有的放在列表裡面。

import re
m = re.findall('a', 'alucka')
print(m)

#輸出 [‘a’, ‘a’]
split方法
分割查詢,以某一字元分割,並把分割後的結果放在列表裡返回
在這裡插入圖片描述

sub方法,subn方法
這兩個方法一樣,都是替換與搜尋,只是,sub方法只是替換,subn方法還會返回替換的次數
引數(正則表示式,替換成的字元,要搜素的字元,要替換的次數)
sub方法
在這裡插入圖片描述
subn方法
在這裡插入圖片描述
compile方法
在這裡插入圖片描述
finditer方法
在這裡插入圖片描述
findall的優先順序

import re
ret = re.findall('www.(baidu|cnblogs).com','www.cnblogs.com')
print(ret)   #結果是['cnblogs']這是因為findall會優先把匹配結果組裡內容返回,如果想要匹配結果,取消許可權即可 ret = re.findall('www.(?:baidu|cnblogs).com','www.cnblogs.com')
 print(ret) #['www.oldboy.com']

split的優先順序

ret = re.split('\d+','luck123dasda9dg')#按數字分割開了
print(ret) #輸出結果:['luck', 'dasda', 'dg']

 ret = re.split('(\d+)','luck123dasda9dg')
print(ret) #輸出結果:['luck', '123', 'dasda', '9', 'dg']

 # 在匹配部分加上()之後和不加括號切出的結果是不同的,
 # 沒有括號的沒有保留所匹配的項,但是有括號的卻能夠保留了
 # 匹配的項,這個在某些需要保留匹配部分的使用過程是非常重要的

匹配標籤

import re


ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
#還可以在分組中利用?<name>的形式給分組起名字
#獲取的匹配結果可以直接用group('名字')拿到對應的值
print(ret.group('tag_name'))  #結果 :h1
print(ret.group())  #結果 :<h1>hello</h1>

ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
#如果不給組起名字,也可以用\序號來找到對應的組,表示要找的內容和前面的組內容一致
#獲取的匹配結果可以直接用group(序號)拿到對應的值
print(ret.group(1))
print(ret.group())  #結果 :<h1>hello</h1>

匹配整數

import re

ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']
ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '-2', '60', '', '5', '-4', '3']
ret.remove("")
print(ret) #['1', '-2', '60', '5', '-4', '3']

數字匹配

1、 匹配一段文字中的每行的郵箱
      http://blog.csdn.net/make164492212/article/details/51656638

2、 匹配一段文字中的每行的時間字串,比如:‘1990-07-12’;

   分別取出1年的12個月(^(0?[1-9]|1[0-2])$)、
   一個月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$

3、 匹配qq號。(騰訊QQ號從10000開始)  [1,9][0,9]{4,}

4、 匹配一個浮點數。       ^(-?\d+)(\.\d+)?$   或者  -?\d+\.?\d*

5、 匹配漢字。             ^[\u4e00-\u9fa5]{0,}$ 

6、 匹配出所有整數