正則表達式 regexpython
動機 : 對字符串(文本)的操做是計算機的主要工做之一
從文本或大字符串中找到某一類型的字串
爲了解決以上問題----》 正則表達式正則表達式
定義 : 本質是由一系列字符和特殊符號組成的字串,用來表示必定規則的某 一類字符串。編程
優勢和使用 : 編程語言
1.是一個獨立的技術
2.能被多種編程語言使用 python ---》 re函數
re.findall(regex,string)
功能 : 按照正則表達式匹配字符串
參數 : regex 正則表達式
string 目標字符串
返回值 : 返回一個列表,列表中是全部匹配到的內容spa
正則元字符對象
* 單個字符
匹配規則 : 匹配相應的字符
e.g. ab ab
In [4]: re.findall('ab','abcdefabg')
Out[4]: ['ab', 'ab']字符串
* 匹配單個字符string
元字符 : .
匹配規則 : 匹配除‘\n’外的任意一個字符it
e.g. f.o ---> foo fao fbo
In [6]: re.findall('f.o','faosfaafbo')
Out[6]: ['fao', 'fbo']
* 匹配字符串的開頭位置
元字符 : ^
匹配規則 : ^位置必須爲字符串的開始位置纔可,一般和其餘元字符同用
e.g. ^abc abcdef
In [8]: re.findall('^abc','abcdefgh')
Out[8]: ['abc']
* 匹配字符串結尾
元字符: $
匹配規則 : 匹配字符串的結尾位置
e.g. py$ a.py
In [11]: re.findall('py$','a.py')
Out[11]: ['py']
* 匹配重複
元字符 : *
匹配規則 : 匹配前面出現的正則表達式0次或屢次
e.g. ab* a ab abbbbb abbbbbb
In [17]: re.findall('ab*','aabbabbljlk')
Out[17]: ['a', 'abb', 'abb']
* 匹配重複
元字符 : +
匹配規則 : 匹配前面出現的正則表達式1次或屢次
n [18]: re.findall('ab+','aabbabbljlk')
Out[18]: ['abb', 'abb']
* 匹配重複
元字符 : ?
匹配規則: 匹配前面出現的正則表達式0次或1次
In [20]: re.findall('ab?','aabbabbljlk')
Out[20]: ['a', 'ab', 'ab']
* 匹配重複
元字符 : {n}
匹配規則: 匹配指定重複的次數
In [22]: re.findall('ab{2}','aabbabbljlk')
Out[22]: ['abb', 'abb']
* 匹配重複
元字符 : {m,n}
匹配規則 : 匹配重複m次到n次
In [26]: re.findall('ab{2,5}','aabbabbbbbbljlk')
Out[26]: ['abb', 'abbbbb']
* 字符集匹配
元字符 : [abcd]
匹配規則 : 匹配字符集中任意一個字符
* 匹配字符區間
元字符 : [0-9] [a-z] [A-Z]
匹配規則 : 匹配區間內任意一個字符 不一樣區間能夠寫在一塊兒,同時還能添加其餘的字符集
e.g. [_3-9a-z]
In [30]: re.findall('[_0-9a-zA-Z]+','hello world hello py_2')
Out[30]: ['hello', 'world', 'hello', 'py_2']
*集合取反
元字符 [^ ....]
匹配規則 : 匹配任意一個再也不集合中的字符
e.g. [^0-9] a g & $
In [31]: re.findall('[^0-9]+','hello world hello py_2')
Out[31]: ['hello world hello py_']
元字符 : \d \D
匹配規則 : 任意一個數字字符 任意一個非數字字符
In [32]: re.findall('\d{8}','12345678')
Out[32]: ['12345678']
元字符 : \w \W
匹配規則: 任意一個數字字母下劃線 任意一個特殊字符
[_0-9a-zA-Z] [^_0-9a-zA-Z]
元字符: \s \S
匹配規則: 任意空字符 匹配任意非空字符
[ \n\r\t\0]
In [41]: re.findall('\s\S+','hello world nihao china')
Out[41]: [' world', ' nihao', ' china']
元字符 : \A \Z
匹配規則: 匹配字符串的開頭位置^ 匹配字符串的結尾位置$
In [52]: re.findall('\Afoo\Z','foo')
Out[52]: ['foo']
元字符: \b \B
匹配規則 : 匹配單詞邊界位置 匹配非單詞邊界位置
單詞邊界 : 數字字母下劃線和其餘字符交界的位置認爲是單詞邊界
In [59]: re.findall(r'foo\b','foo food foot')
Out[59]: ['foo']
In [60]: re.findall(r'foo\B','foo food foot')
Out[60]: ['foo', 'foo']
元字符 : |
匹配規則 : 鏈接多個正則表達式 造成或關係
In [64]: re.findall('abc|bcd','abcdefbcdef')
Out[64]: ['abc', 'bcd']
轉義字符
* $ ? + \d \s
1.正則表達式中有不少特殊字符爲元字符,若是在設定匹配時須要匹配到特殊字符則用轉義
e.g. \ ----> \\ * ---> \* \d ----> \\d
2. 當使用某個編程語言時,正則表達式每每要以字符串的形式傳入
而編程語言的字符串又有轉義性質
python str -----》 raw str 認爲字符串中爲原始內容,不進行轉義
\\* \*
匹配單個字符 : 普通字符 . \d \D \w \W \s \S [...] [^...]
匹配位置 : ^ $ \A \Z \b \B
匹配重複次數 : * + ? {n} {m,n}
其餘 : |
貪婪和非貪婪
貪婪模式 : 當重複次數不肯定是,正則表達式老是儘量多的向後匹配
* + ? {m,n}
非貪婪模式 : 在重複的元字符後加?
In [94]: re.findall('ab*?','abbbbbbba')
Out[94]: ['a', 'a']
In [95]: re.findall('ab+?','abbbbbbba')
Out[95]: ['ab']
正則表達式子組
在一個正則表達式中能夠用()取正則表達式的一部分,爲該正則表達式的一個子組
regex (ab)*cdef
子組能幹什麼
*子組表示一個內部的總體,能夠改變重複的元字符做用範圍
*不少編程語言函數能夠單獨提取子組的內容
*在使用和調用上更加方便
一個正則表達式中原則上能夠有不少子組。從外到內,從左到有分別稱爲第一子組,第二子組。。。。。。子組不要交叉
捕獲組
子組命名 (?P<name>abcd)
子組調用 (?P=name)
(?P<dog>ab)cdef(?P=dog)
非捕獲組
your time:
匹配長度爲8-10位的密碼,必須以字母開頭,數字字母下劃線組成
In [2]: re.findall(r'^[a-zA-Z]\w{7,9}$','abc123_a')
Out[2]: ['abc123_a']
匹配身份證號
In [6]: re.search(r'\d{17}(\d|x)','123123123123123123').group()
Out[6]: '123123123123123123'
匹配一段文字中以大寫字母開頭的單詞
In [14]: re.findall(r'\b[A-Z]\w*\b',data)
Out[14]: ['Python', 'Hello', 'World']
python ---- > regex
模塊 re
compile(pattern, flags=0)
功能 : 生成正則表達式對象
參數 : pattern : 正則表達式
flags : 擴展標誌位,默認爲0表示不進行任何擴展
返回值 : 正則表達式對象
obj = compile('abc')
如下 **** 中的函數既能re直接調用又能compile對象調用
**************************************************
re.findall(pattern, string, flags=0)
功能 : 根據正則表達式匹配目標字符串
參數 : pattern 正則表達式
string 目標字符串
flags : 正則擴展標誌位
返回值 : 匹配到的全部內容以列表返回
若是有分組則只返回子組能匹配到的內容
obj.findall(string=None, pos=0,endpos=99999)
功能 : 根據正則表達式匹配目標字符串
參數 : string 目標字符串
pos : 匹配目標字符串的起始位置
endpos : 匹配目標字符串的結束位置
返回值 : 匹配到的全部內容以列表返回
若是有分組則只返回子組能匹配到的內容
finditer()
功能 : 同findall
參數 : 同findall
返回值 : 返回一個迭代對象,迭代獲取的每一個值爲match obj
*match 對象 : finditer match fullmatch search
這些函數將正則匹配到的結果以match對象的形式給出,方便進行過具體的操做
fullmatch()
功能 : 用正則表達式徹底匹配某個字符串
參數 : 目標字符串
返回值 : 返回匹配到的match對象,若是沒有匹配到返回None
match()
功能 : 匹配字符串的開頭
參數 : 目標字符串
返回值i: 若是匹配到內容返回match object 不然返回None
search()
功能 : 匹配第一處符合正則的字串
參數 : 目標字串
返回值: 若是匹配到內容返回match object 不然返回None
split()
功能 : 按照正則表達式切割字符串
參數 : 目標字符串
返回值: 將切割後的字符串放入列表
sub(re_str,string,max)
功能 : 用指定字符串替換正則表達式匹配到的部分
參數 : re_str 待替換的字符串
string : 目標字符串
max : 最多替換幾處
返回值 : 替換後的字符串
subn()
功能 : 用指定字符串替換正則表達式匹配到的部分
參數 : re_str 待替換的字符串
string : 目標字符串
max : 最多替換幾處
返回值 : 返回值爲二元元組,第一項爲替換後的字符串,第二項爲實際替換幾處
****************************************************
compile返回對象的屬性
flags : 正則表達式表示位的整形表示
pattern : 正則表達式
groupindex : 返回以捕獲組的名稱爲鍵,第幾組爲值得字典
groups: 正則表達式中一共有多少個子組
match search fullmatch finditer
match對象屬性和方法
屬性:
pos : 匹配目標字符串的開始位置
endpos : 匹配目標字符串的結束位置
lastgroup:獲取最後一個子組的名稱,若是沒名字則爲None
lastindex:或許最後一個子組是第幾子組
re : match匹配所用的正則表達式
regs : 正則表達式總體及每一個子組所匹配的部分
string : match匹配的目標字符串
方法:
start()
獲得匹配內容在字符串中的開始位置
end()
獲得匹配內容在字符串中的結束位置(結束字符下標的下一個)
span()
獲得匹配到的內容在字符串中的起止位置
group(n)
功能: 獲取match對象匹配到的內容
參數: n 默認爲0表示 整個正則匹配到的內容
當給n附一個正整數時則表示要獲取第n個子組匹配內容
返回值:返回匹配到的字符串
groups()
功能 : 獲取全部子組匹配到的內容
groupdict()
功能 : 將捕獲組的名稱和匹配的內容造成鍵值對關係
re.compile re.findall re.match re.search .....
'A',
'ASCII',
'S' 讓 . 能夠匹配換行
'DOTALL',
'I', 忽略大小寫
'IGNORECASE'
'L',
'LOCALE',
'M', 做用於 ^ $ 使其能匹配每行的開頭結尾
'MULTILINE'
'T',
'TEMPLATE',
'U',
'UNICODE'
'X' 讓你的正則能夠添加以#開頭的註釋
'VERBOSE',
當多個flag同時使用時 中間用豎線分割re.I | re.S