python--re模塊(正則表達式)


正則在線測試  http://tool.chinaz.com/regex  

需要  import re 

\   轉義字符

 

[abc]   匹配中括號中的一個字符

[a-c]   匹配a-c中的一個字符

[a-dm-p] 匹配a-d或m-p中的一個字符

.     除換行符\n 之外的任何單個字符匹配

\w    匹配一個單詞字符 字母(包括a-z  A-Z)、數字、下划線

\W   匹配  除\w之外的其它字符

\s   匹配  任何空白字符,(包括 換行符\n、回車符\r、制表符\t、垂直制表符\v、換頁符\f)

\S    匹配 除\s之外的其它字符

\d    匹配數字(0--9)

\D    匹配  除\d之外的其它字符

\n   匹配換行符\n

\t    匹配制表符

\b   匹配單詞結尾        ab\b     以ab為結尾的單詞【邊界分隔符可以是 空格、逗號、-、句號】

\B    匹配非單詞邊界     比如 ab\B   不是以ab結尾的單詞

^    匹配字符串開頭    ^gh  gh是字符串的頭

[^x]   匹配除了x之外的任意字符,  非的意思

[^abc]   匹配除了abc三個字母之外的任意字符

$    匹配字符串的尾   gh$   gh是字符串的尾

ae|b    匹配ae或b   【先左后右  ab|abc 匹配ab不匹配abc】

()    分組  

按照左括號從左往右排序第一組 \1  以此類推   表示與第一組內容相同,后面的分組的內容跟這個相同時\1, 需要注意的是,有一個隱含的全局分組(就是0),就是整個正則表達式

(?P<name>……)  除了原有的編號外,再指定一個名稱,后面的分組的內容跟這個相同時(?P=name)

例子  

findall    split   有分組優先

{n}   重復n次

{n,}   重復n次或多於n次

{n,m}  重復 n -m次

{n}?    重復n次   盡量少重復

{n,}?    重復n次或多於n次   盡量少重復

{n,m}?    重復n-m次   盡量少重復

*  表示重復0次或多  【盡量多的匹配  貪婪匹配】

*?    重復0次或多次   盡量少重復

+  重復1次或多      【盡量多的匹配  貪婪匹配】

+?    重復1次或多次   盡量少重復

?     重復0次或1次   

注意  量尺?  就是惰性匹配

.*?x   遇到x就停

r 后面的字符都是普通字符

?=    正向預查[正向條件匹配]   這個位置滿足條件的就匹配,不滿足條件就不匹配    

例 \d{3}-\d{8} (?=Microsoft)    Microsoft不會顯示出來

?!     負正向預查 [非正向條件匹配]    這個位置滿足條件的就不匹配,不滿足條件就匹配    

例 \d{3}-\d{8} (?!Microsoft)       Microsoft不會顯示出來

?<=   反向預查    這個位置滿足條件的就匹配,不滿足條件就不匹配  

例  (?<=girl) \d{3}-\d{3}      條件在前頭

|     從左往右匹配   左邊一旦匹配不在匹配右邊,所以把長的放左邊

 

正則方法:

 

 

標志位

re.I 忽略大小寫

re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴於當前環境

re.M 多行模式,會影響^ $,每一行都是一個新的開頭和結尾

re.S 即為' . '並且包括換行符在內的任意字符(' . '不包括換行符)

re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴於 Unicode 字符屬性數據庫   默認設置

re.X 為了增加可讀性,忽略空格和' # '后面的注釋   

 

 

compile 函數

用於編譯正則表達式,生成一個正則表達式對象

語法格式為:p=re.compile(pattern[, flags])

參數1   pattern : 一個字符串形式的正則表達式

參數2   flags 可選,標志位  表示匹配模式,比如忽略大小寫,多行模式等

 

 

 

 

findall

在字符串中找到正則表達式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表

語法格式一:s=re.findall('\d','liming tan23guwu468zhong')

參數1   正則表達式

參數2   字符串

注意:findall函數的正則表達式中如果有(),默認優先匹配()內;要取消分組優先在組內加?:

例子 s=re.findall('www.(?:baidu|oldboy).com','jhgfwww.oldboy.comhgffd')  

可以給分組起名 (?P<名字>\d+)

 

re.finditer

findall 類似,在字符串中找到正則表達式所匹配的所有子串,並把它們作為一個迭代器返回

參數1   正則表達式

參數2   字符串

參數3  可選  標志位

返回值 是一個對象迭代器,每個對象需要group()才能拿到結果

例子

s=re.finditer('\d+','adff34lkjhg87nhbvf90')

for i in s:

    print(i.group())

 

 

語法格式二:s=p.findall('2345lm0987MING654abc87654',5,18)

p 正則對象

參數1   字符串

參數2   起始位置

參數3   結束位置(不包括)

例子     s=p.findall('2345lm0987MING654abc87654',5,18)

 

re.search方法

掃描整個字符串並返回第一個成功的匹配

函數語法:re.search(pattern, string, flags=0)

參數1   正則表達式

參數2   要匹配的字符串

參數3    可選參數   標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等

 

匹配成功re.search方法返回一個匹配的對象,否則返回None

我們可以使用group()匹配對象函數來獲取匹配表達式,如果返回的是Nonegroup()時會報錯

group()  可以加一個參數(組號),組號就是正則表達式的分組的序號 第一個()序號是1

 

例子

s=re.search(r'[A-Z]+','2345lm098KH7654abc87654')

if s !=None:

    ss=s.group()

    print(ss)

 

re.match函數

re.match 嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none

匹配成功返回一個匹配的對象我們可以使用group()匹配對象函數來獲取匹配表達式

如果返回的是None,group()時會報錯

例子

s=re.match(r'[A-Z]+','B2345lm098KH7654abc87654')

if s !=None:

    ss=s.group()

    print(ss)

 

re.split   分割

能夠匹配的做為分隔符,分割后返回列表

語法  s=re.split(pattern, string[, maxsplit=0, flags=0])

參數1  正則表達式

參數2  字符串

參數3  可選   分隔次數,maxsplit=1 分隔一次,默認為 0,不限制次數

參數4  可選   標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等

注意:分組功能

如果有(),會保留()組內分隔符

例子

s=re.split('(\d+)','adjg24kjbvc76lkjh89uytrc94mhb')

結果 ['adjg', '24', 'kjbvc', '76', 'lkjh', '89', 'uytrc', '94', 'mhb']

 

 

re.sub用於替換字符串中的匹配項

語法:s=re.sub(pattern, repl, string, count=0)

參數1  正則表達式   滿足正則的被替換

參數2  替換的字符串,也可為一個函數

參數3  原字符串

參數4  替換的最大次數,默認 0 表示替換所有的匹配

返回替換后的字符串

 

s=re.subn('\d','|','liming2lixueqian8李明')

參數1  正則表達式   滿足正則的被替換

參數2  替換的字符串,也可為一個函數

參數3  原字符串

參數4  替換的最大次數,默認 0 表示替換所有的匹配

返回一個元組  元組的第一項就是替換后的字符串   第二項是被替換的次數

 

 

我的常用匹配 

 \d+\.?\d*            數值

 

 

 

 

天子驕龍


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM