
正則在線測試 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()匹配對象函數來獲取匹配表達式,如果返回的是None,group()時會報錯
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* 數值
天子驕龍
