一、正则表达式的含义
- 定义:即文本的高级匹配模式,提供搜索替换等功能.其本质是一系列由字符和特殊符号组成的字符串,这个字符串即正则表达式
- 匹配原理:由普通的字符和特殊符号构成,通过描述字符的重复,位置,种类等行为达到匹配某一类字符串的目的
- 正则特点:方便处理文本,支持语言众多,使用灵活多样
二、正则语法
- 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']
........待补充