re.1-常用表示式規則
一、正則表示式的含義
- 定義:即文字的高階匹配模式,提供搜尋替換等功能.其本質是一系列由字元和特殊符號組成的字串,這個字串即正則表示式
- 匹配原理:由普通的字元和特殊符號構成,通過描述字元的重複,位置,種類等行為達到匹配某一類字串的目的
- 正則特點:方便處理文字,支援語言眾多,使用靈活多樣
二、正則語法
- re.findall(pattern,string)
-
- 功能: 使用正則表示式匹配字串
- 引數
- pattern 正則表示式
- string 目標字串
- 返回值 : 返回匹配內容列表
三、正則表示式模式
1. 普通字元
元字元 : a B c
匹配規則: 每個字元匹配對應的自身字元
In [15]: re.findall('ab','abcdaefabcdef') Out[15]: ['ab', 'ab'] In [16]: re.findall('你好','你好,北京') Out[16]: ['你好']
2. 或
元字元 : |
匹配規則: 匹配 | 兩邊任意一個正則表示式
In [24]: re.findall('ab|cd',"abcdef") Out[24]: ['ab', 'cd']
3. 匹配單個字元
元字元 : .
匹配規則: 匹配除換行外任意一個字元
f.o --> foo fao
In [25]: re.findall('f.o',"foo fao") Out[25]: ['foo', 'fao']
4. 匹配字串開始位置
元字元 : ^
匹配規則: 匹配目標字串的開始位置
In [29]: re.findall('^Jame',"Jame is a boy") Out[29]: ['Jame']
5. 匹配字串結束位置
元字元 : $
匹配規則: 匹配目標字串的結束位置
In [32]: re.findall('Jame$',"Hi,Jame") Out[32]: ['Jame']
6. 匹配重複
元字元 : *
匹配規則: 匹配前面的字元出現0次或多次
fo* --> fooooooooooo f
In [34]: re.findall('fo*',"fooooooabceffo") Out[34]: ['foooooo', 'f', 'fo']
7. 匹配重複
元字元: +
匹配規則 : 匹配前面的字元出現1次或多次
fo+ --> fooooooooooo fo
In [37]: re.findall('fo+',"fooooooabceffo") Out[37]: ['foooooo', 'fo']
8. 匹配重複
元字元 : ?
匹配規則 : 匹配前面的字元出現0次或1次
fo? --> f fo
In [43]: re.findall('fo?',"fooooooabceffo") Out[43]: ['fo', 'f', 'fo']
9. 匹配重複
元字元 : {n}
匹配規則 : 匹配前面的字元重複指定的次數
fo{3} --> fooo
In [46]: re.findall('fo{3}',"fooooooabceffo") Out[46]: ['fooo']
10. 匹配重複
元字元 : {m,n}
匹配規則 : 匹配前面的字元出現 m -- n次
fo{2,4} --> foo fooo foooo
In [49]: re.findall('fo{2,4}',"fooooooabceffoo") Out[49]: ['foooo', 'foo']
11. 匹配字符集
元字元: [字符集]
匹配規則: 匹配字符集中任意一個字元
[abc123] --> a b c 1 2 3
[a-z] [A-Z] [0-9]
[$#_a-zA-Z]
In [50]: re.findall('[A-Z][a-z]*',"Hi,This is Lua") Out[50]: ['Hi', 'This', 'Lua']
12. 匹配字符集
元字元 : [^...]
匹配規則 : 匹配除指定字元外的任意一個字元
[^abc] --> 除了a b c外任意一個字元
[^a-z]
In [61]: re.findall('[^ ]+',"This is a test") Out[61]: ['This', 'is', 'a', 'test']
13. 匹配任意(非)數字字元
元字元 : \d \D
匹配規則:
\d 匹配任意一個數字字元 [0-9]
\D 匹配任意一個非數字字元 [^0-9]
In [63]: re.findall('\d+',"2018年就快過去,2019馬上到來") Out[63]: ['2018', '2019']
14. 匹配任意(非)普通字元
元字元 : \w \W
匹配規則:
\w 匹配普通字元 (數字字母下劃線,utf8字元)
\W 匹配特殊字元
In [71]: re.findall('\w+',"PORT#1234,Error 44% 下降") Out[71]: ['PORT', '1234', 'Error', '44', '下降']
15. 匹配任意(非)空字元
元字元 : \s \S
匹配規則:
\s 匹配任意空字元 [ \r\n\t\v\f]
\S 匹配任意非空字元
In [72]: re.findall('\w+\s+\w+',"hello world") Out[72]: ['hello world'] In [74]: re.findall('^\S+',"Terna-123#H xxxxxxx") Out[74]: ['Terna-123#H']
16. 匹配字串開頭結尾位置
元字元 : \A \Z
匹配規則:
\A 匹配字串開頭位置
\Z 匹配字串結尾位置
In [80]: re.findall('\A\d+-\d+\Z',"1000-15000") Out[80]: ['1000-15000']
絕對匹配(完全匹配) : 保證正則表示式匹配目標字串的 全部內容
17. 匹配(非)單詞邊界
元字元 : \b \B
匹配規則:
\b 匹配單詞邊界 (普通字元和其他字元的交接)
\B 匹配非單詞邊界
In [85]: re.findall(r'\bis\b',"This is a boy") Out[85]: ['is'] In [86]: re.findall(r'\Bis',"This is a boy") Out[86]: ['is']
18.元字元總結
匹配單個字元: . [...] [^...] \d \D \w \W \s \S
匹配重複: * + ? {n} {m,n}
匹配位置: ^ $ \A \Z \b \B
其他: | () \
19.正則表示式的轉義
正則特殊符號: . * + ? ^ $ () [] | \
正則表示式如果匹配特殊字本身符則需要加\
e.g. 匹配字元 . 用 \.
目標字串 正則表示式 字串
$10 \$\d+ "\\$\\d+"
raw字串: 對字串不進行轉義解析
r'\$\d+' ==> '\\$\\d+'
20.貪婪和非貪婪
貪婪模式: 正則表示式的重複匹配預設總是儘可能多的向後 匹配內容
* + ? {m,n}
非貪婪(懶惰)模式 : 儘可能少的匹配內容
貪婪-->非貪婪 *? +? ?? {m,n}?
In [105]: re.findall(r'ab+?',"abbbbbbbbb") Out[105]: ['ab']
........待補充