1. 程式人生 > >regex正則表達式學習

regex正則表達式學習

函數 通過 flags aid style 復雜 dict 比較 upd

正則表達式

動機
1. 處理文本成為計算機常見工作之一
2. 對文本內容的搜索提取是一項比較復雜困難的工作
3. 為了快速方便處理上述問題,正則表達式技術誕生,主鍵發展為一個被眾多語言使用的獨立技術

定義:即高級文本匹配模式,提供了搜索,替代等功能。本質是由一系列特殊符號和字符組成的子串,這個子串即是正則表達式。這個表達式描述了字符和字符的重復行為,可以匹配一類特征的字符串。

目標:
1. 熟練使用正則表達式符號
2. 正確組合和理解一般的正則表達式
3. 能夠使用Python操作正則表達式

正則表達式特點
* 方便進行檢索和修改
* 支持語言眾多
* 靈活多樣
* mongo正則類型,django等框架作為url匹配,爬蟲


正則表達式的使用
Python ----》 re模塊 處理正則表達式

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

元字符 (即正則表達式中有特殊含義的符號)

1. 普通字符
元字符 : abc
匹配規則 : 匹配相應的普通字符

In [6]: re.findall("abc","abcdefghabcdhig")
Out[6]: [‘abc‘, ‘abc‘]

2. 或
元字符 : ab|cd
匹配規則 : 匹配|兩邊任意一個正則表達式符合的情況
In [7]: re.findall("ab|cd","abcdefghabcdhig")

Out[7]: [‘ab‘, ‘cd‘, ‘ab‘, ‘cd‘]
* |兩側不要有沒用的空格

3. 匹配單一字符
元字符 : .
匹配規則: 匹配除了換行之外的任意字符
f.o---》 foo fao f@o

In [10]: re.findall("f.o","foo is not fao")
Out[10]: [‘foo‘, ‘fao‘]

4. 匹配開始位置
元字符: ^
匹配規則: 匹配一個字符串的開始位置
^Hello ---> Hello world : Hello

In [14]: re.findall("^hello","hello world")
Out[14]: [‘hello‘]

5. 匹配結束位置

元字符: $
匹配規則:匹配目標字符串的結束位置
py$ ---> hello.py

In [16]: re.findall("py$","hello.py")
Out[16]: [‘py‘]

6. 匹配重復
元字符 : *
匹配規則: 匹配前面的正則表達式重復0次或多次
fo* ---》 fo foo foooooooo f

In [19]: re.findall("ab*","abbcdef")
Out[19]: [‘abb‘]

7. 匹配重復
元字符 : +
匹配規則: 匹配前面的正則表達式重復1次或多次

ab+ ---》 ab abbb abbbb
In [23]: re.findall(".+py$","hello.py")
Out[23]: [‘hello.py‘]

8. 匹配重復
元字符: ?
匹配規則: 匹配前面的正則表達式重復0次或1次
ab? --> a ab

In [24]: re.findall("ab?","abcdefa")
Out[24]: [‘ab‘, ‘a‘]

9. 匹配重復
元字符: {n}
匹配規則 : 匹配指定的重復次數
ab{3} ---> abbb
In [25]: re.findall("ab{3}","abbbbbbbb")
Out[25]: [‘abbb‘]

10. 匹配重復
元字符 : {m,n}
匹配規則 : 匹配前面的正則表達式重復 m次 到 n次
ab{3,5} abbb abbbb abbbbb
In [26]: re.findall("ab{2,5}","abcdabbbabbbbbb")
Out[26]: [‘abbb‘, ‘abbbbb‘]

11. 匹配字符集合
元字符: []
匹配規則 : 匹配括號範圍內的任意一個字符
[abc123d] a b c 1 2 3 d
[a-z]
[A-Z]
[0-9]
[123a-zA-Z]
In [31]: re.findall("[_0-9a-zA-Z]","Hello world 123")

12. 匹配字符集合
元字符: [^...]
匹配規則 : 匹配除指定字符集之外的任意字符

In [34]: re.findall("[^abc]","nihao abc")
Out[34]: [‘n‘, ‘i‘, ‘h‘, ‘o‘, ‘ ‘]

13. 匹配任意(非)數字字符
元字符: \d \D
匹配規則 : \d 匹配任意數字字符 \D 匹配任意非數字字符
[0-9] [^0-9]

In [35]: re.findall("1\d{10}","17611665537")
Out[35]: [‘17611665537‘]

14. 匹配(非)普通字符 (普通字符: 數字字母下劃線)
元字符 : \w \W
匹配規則: \w 匹配任意一個普通字符 \W匹配任意非普通字符
[_0-9a-zA-Z] [^_0-9a-zA-Z]

In [39]: re.findall("\w+","hello$1")
Out[39]: [‘hello‘, ‘1‘]

In [40]: re.findall("\W+","hello$1")
Out[40]: [‘$‘]

15. 匹配(非)空字符
元字符 : \s \S
匹配規則:\s 匹配任意空字符 \S 匹配任意非空字符
[ \n\t\r]

In [45]: re.findall("\s",‘hello world\r\n\t\0‘)
Out[45]: [‘ ‘, ‘\r‘, ‘\n‘, ‘\t‘]

16. 匹配起止位置
元字符: \A \Z
匹配規則 : \A匹配開始位置 \Z匹配結束位置
^ $
絕對匹配 \Aabc\Z ----> abc (且字符串只是abc)

In [48]: re.findall("\A/\w+/\w+\Z",‘/football/zhongchao‘)
Out[48]: [‘/football/zhongchao‘]

17. 匹配(非)單詞邊界位置
元字符: \b \B
匹配規則 : \b 匹配單詞的邊界 \B匹配非單詞的邊界

單詞邊界 : 數字字母下劃線和其他字符的交界位置為單詞的邊界

abc_1 haha

In [55]: re.findall(r"\Bis\b",‘This is a test‘)
Out[55]: [‘is‘]

元字符總結

匹配單個字符:a . \d \D \w \W \s \S [...] [^...]
匹配重復性 : * + ? {N} {m,n}
匹配某個位置 : ^ $ \A \Z \b \B
其他 : | () \

練習
匹配長度8-10位的密碼 必須以數字開頭,數字字母下劃線組成
^[0-9]\w{7,9}$


轉義字符

正則表達式特殊符號 :
. * ? $ ‘‘ "" [] {} () \ ^
如果想匹配特殊符號則加轉義

\"\.\" -----> "."

r ---> raw 原生字符串 : 不進行轉義

In [64]: re.findall(r"\bis",‘This is‘)
Out[64]: [‘is‘]


貪婪和非貪婪

正則表達式默認的重復匹配模式 : 貪婪模式
盡可能多的向後匹配

* + ? {m,n} 這四種情況下會產生貪婪模式

非貪婪模式 : 盡可能少的匹配內容,滿足正則表達式含義即可

貪婪---》非貪婪 *? +? ?? {m,n}?

In [70]: re.findall("ab*?",‘abbbbbbbbcded‘)
Out[70]: [‘a‘]

In [71]: re.findall("ab+?",‘abbbbbbbbcded‘)
Out[71]: [‘ab‘]

正則表達式分組

使用()可以為一個正則表達式建立一個子組,子組可以看做內部的整體
abcdef ----》 http://www.baidu.com

子組的作用
1. 增加子組後對正則表達式整體的匹配內容沒有影響
2. 子組可以改變重復元字符的重復行為
3. 子組在某些操作中可以對子組匹配內容單獨提取

子組的註意事項
1.每個正則表達式可以有多個子組,由外到內由左到右為第一第二。。。。子組
2.子組通常不要交叉

捕獲組和非捕獲組(命名組和非命名組)
子組命名格式
(?P<name>abc)
1.很多編程接口可以直接通過名字獲取子組匹配內容
2.捕獲組中的正則表達式可以通過名字重復調用
(?P=name)

(?P<dog>ab)cdef(?P=dog) -----> abcdefab

In [83]: re.search(‘(ab)+‘,‘ababababab‘).group()
Out[83]: ‘ababababab‘

In [84]: re.search(‘(?P<dog>ab)cdef(?P=dog)‘,‘abcdefabcde‘).group()
Out[84]: ‘abcdefab‘

匹配身份證號
\d{17}(\d|x)

re模塊

obj = compile(pattern,flags = 0)
功能: 獲取正則表達式對象
參數: pattern : 正則表達式
flags: 功能標誌位,提供更豐富的匹配
返回值 : 正則表達式對象

re模塊和compile對象均有的函數

obj.findall(string,pos,endpos)
功能 : 通過正則表達式匹配字符串
參數 : string 目標字符串
pos 目標字符串的匹配開始位置
endpos 目標字符串的結束位置
返回值 : 匹配到的所有內容以列表返回

* 如果正則表達式有子組則只顯示子組匹配內容

obj.split(string)
功能 : 按照正則表達式切割目標字符串
參數 : 目標字符串
返回值 : 切割後的內容

obj.sub(replaceStr,string,max)
功能: 替換正則表達式匹配到的內容
參數: replaceStr 要替換的內容
string 目標字符串
max 最多替換幾處
返回值 : 返回替換後的字符串

subn(repl,string,count)
功能: 替換正則表達式匹配到的內容
參數: repl 要替換的內容
string 目標字符串
count 最多替換幾處
返回值 : 返回替換後的字符串和實際替換的個數


re.finditer(pattern,string)
功能 : 使用正則表達式匹配目標內容
參數 : 目標字符串
返回值 : 叠代對象 叠代的每個內容為一個match對象

re.match(pattern,string)
功能 : 匹配一個字符串的開頭
參數 : 目標字符串
返回值 : 如果匹配到返回 match obj
沒有匹配到返回 None

re.search(pattern,string)
功能 : 匹配一個字符串
參數 : 目標字符串
返回值 : 如果匹配到返回 match obj
沒有匹配到返回 None
* match 只能匹配字符串的開頭位置,search可以匹配任意位置,但是也只能匹配一處
* 通常match對象調用其屬性時往往需要try異常處理

fullmatch()
要求目標字符串完全匹配


compile 對象特有屬性(re模塊沒有)
flags : 標誌位
pattern : 正則表達式
groupindex : 捕獲組形成的字典
groups : 多少個子組


match 對象屬性方法

print(match_obj.pos) #目標字符串開頭位置
print(match_obj.endpos) # 目標字符串結束位置
print(match_obj.re) # 正則表達式對象
print(match_obj.string) # 目標字符串
print(match_obj.lastgroup) # 最後一組的名字
print(match_obj.lastindex) # 最後一組是第幾組

span() 匹配到內容的起止位置
start() 匹配到內容的開始位置
end() 匹配到內容的結束位置

group(n)
功能 : 獲取match 對象匹配的內容
參數 : 默認為0 表示獲取正則整體的匹配內容
如果傳入大於0的正數則表示獲取對應子組匹配內容
返回值:返回匹配到的內容

groups()
功能 : 得到所有子組匹配的內容

groupdict()
功能 :得到所有捕獲組匹配的內容


作業 : 讀取一個文件的內容 ,將文件中所有的以大寫字母開頭的單詞匹配出來

regex正則表達式學習