1. 程式人生 > >python re正則

python re正則

完全 OS nic 模塊 鍵值對 單個 單獨 cas ups

正則表達式 regex


動機 : 對字符串(文本)的操作是計算機的主要工作之一
從文本或大字符串中找到某一類型的字串
為了解決以上問題----》 正則表達式

定義 : 本質是由一系列字符和特殊符號組成的字串,用來表示一定規則的某 一類字符串。


優點和使用 :

1.是一個獨立的技術
2.能被多種編程語言使用 python ---》 re


re.findall(regex,string)
功能 : 按照正則表達式匹配字符串
參數 : regex 正則表達式
string 目標字符串
返回值 : 返回一個列表,列表中是所有匹配到的內容


正則元字符

* 單個字符
匹配規則 : 匹配相應的字符
e.g. ab ab

In [4]: re.findall(‘ab‘,‘abcdefabg‘)
Out[4]: [‘ab‘, ‘ab‘]


* 匹配單個字符

元字符 : .
匹配規則 : 匹配除‘\n’外的任意一個字符

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

python re正則