正则表达式笔记

正则表达式

动机
1.文本处理已经成为计算机常见的工作之一
2.对文本内容的搜索,定位,提取 是逻辑比较复杂的工作
3.为了快速方便的解决上述问题,产生了正则表达式技术
定义:即文本的高级匹配模式,提供搜索,替换等内容,其本质是一系列由字符和特殊符号组成的字符串
这个字符串即正则表达式
匹配原理:由普通字符和特殊符号构成,通过描述字符的重复,位置,种类等行为,达到匹配到某一类字符串的目的

目标
1.熟练掌握正则表达式符号
2.读懂常见的正则表达式,编写基本的搜索提取功能正则
3.能够熟练使用re模块操作正则表达式

正则表达式特点:
* 方便文本处理
* 支持语言众多
* 使用灵活,变化多样

Python ---- > re 模块
re.findall(pattern,string)
功能: 提取所有的正则匹配内容
参数: pattern 正则表达式
string 目标字符串
返回值: 列表, 所有提取到的内容

元字符的使用
1.普通字符
元字符:a B c ..
匹配规则: 每个字符匹配对应的字符
In [9]: re.findall('ab','asdhisdabsdsab')
Out[9]: ['ab', 'ab']
* Python中正则表达式是可以匹配汉字的

2.或
元字符: |
匹配规则: 匹配 | 两侧任意一个正则表达式
In [13]: re.findall('ab|ds','asdhisdabsdsab')
Out[13]: ['ab', 'ds', 'ab']

In [14]: re.findall('ab|bc','abcdefgh')
Out[14]: ['ab']

3.匹配单个字符
元字符: .
匹配规则: 匹配除换行外的任意字符
In [17]: re.findall('f.o','fxoxabcdfoo')
Out[17]: ['fxo', 'foo']
In [19]: re.findall('你.','你好')
Out[19]: ['你好']

4.匹配字符串开始位置
元字符: ^
匹配规则: 匹配目标字符串的开始位置
In [22]: re.findall('^Hello','Hello,jame,nihao ')
Out[22]: ['Hello']

5.匹配字符串的结束位置
元字符: $
匹配规则: 匹配字符串的结尾位置
In [23]: re.findall('nihao$','Hello,jame,nihao')
Out[23]: ['nihao']

In [24]: re.findall('nihao$','Hello,jame,nihao ')
Out[24]: []

6.匹配重复
元字符: *
匹配规则:匹配前面的字符重复0次或者多次
例: fo* ---->foooo f
In [25]: re.findall('fo*','fooooffoo')
Out[25]: ['foooo', 'f', 'foo']

7.匹配重复
元字符: +
匹配规则: 匹配前面的字符出现过1次或多次
fo+ ------------> foooo fo
In [26]: re.findall('fo+','fooooffoo')
Out[26]: ['foooo', 'foo']

8.匹配重复
元字符: ?
匹配规则: 匹配前面的字符出现0次或者1次
fo?----->f fo
In [27]: re.findall('fo?','fooooffo')
Out[27]: ['fo', 'f', 'fo']

9.匹配重复
元字符: {n}
匹配规则: 匹配重复指定的次数
fo{3}----->fooo
In [28]: re.findall('fo{2}','fooooffoo')
Out[28]: ['foo', 'foo']

10.匹配重复
元字符: {m,n}
匹配规则: 匹配前面的字符出现 m--n 次
fo{2,4}----->foo fooo foooo
In [29]: re.findall('fo{2,4}','fooooffoo')
Out[29]: ['foooo', 'foo']

11.匹配字符集
元字符: [字符集]
匹配规则: 匹配字符集中任意一个字符
[abc123] ---> a b c 1 2 3
[a-z] [A-Z] [0-9]
[123a-zA-Z]
In [30]: re.findall('[a-zA-Z]{4}',"This is a test")
Out[30]: ['This', 'test']

In [32]: re.findall('[A-Z]+[a-z]*',"This is a Test")
Out[32]: ['This', 'Test']

In [33]: re.findall('[0-9]+',"10 + 9 = 19")
Out[33]: ['10', '9', '19']

12.匹配字符集
元字符: [^...]
匹配规则: 匹配除了字符集中的任意一个字符
[^abc] ----> 除了a b c 以外的任意一个字符
In [35]: re.findall('[^ ]+',"This is a test")
Out[35]: ['This', 'is', 'a', 'test']
In [36]: re.findall('[^0-9]',"10 + 9 = 19")
Out[36]: [' ', '+', ' ', ' ', '=', ' ']

13.匹配任意(非)数字
元字符: \d \D
匹配规则: \d 匹配任意数字字符 |[0-9]
\D 匹配任意非数字字符 [^0-9]
In [37]: re.findall('1\d{10}',"13598945653")
Out[37]: ['13598945653']
In [38]: re.findall('\D',"1359dsajdoaww%^^$")
Out[38]: ['d', 's', 'a', 'j', 'd', 'o', 'a', 'w', 'w', '%', '^', '^', '$']

14.匹配任意(非)普通字符
元字符: \w \W
匹配规则: \w 匹配任意普通字符 [_0-9a-zA-Z] 也能匹配汉字
\W 匹配任意非普通字符
In [40]: re.findall('\w+',"port#10035,error 44%d")
Out[40]: ['port', '10035', 'error', '44', 'd']

15.匹配(非)空字符
元字符: \s \S
匹配规则: \s 匹配任意空字符 [\r\n\t\v\f]
\S 匹配任意非空字符
In [42]: re.findall('\S+','hello world')
Out[42]: ['hello', 'world']

16.匹配字符串位置
元字符: \A \Z
匹配规则: \A 匹配字符串开头位置 ^
\Z 匹配字符串结尾位置 $
In [3]: re.findall('\A\d+-\d+\Z',"1000-1500")
Out[3]: ['1000-1500']

*绝对匹配,当正则表达式前有^最后有$时,那么这个正则表达式一定是要匹配目标字符
串的全部内容,否则就什么都匹配不到

17.匹配单词边界
元字符: \b \B
匹配规则: \b 匹配单词边界位置 普通字符和非普通字符的交界认为是单词的边界
\B 匹配非单词边界位置
In [7]: re.findall(r'\bis\b',"This is a dog") r代表原始字串
Out[7]: ['is']

In [8]: re.findall(r'\Bis\B',"This is a dog")
Out[8]: []

In [9]: re.findall(r'\Bis',"This is a dog")
Out[9]: ['is']

元字符总计
匹配单个字符: . [...] [^...] \d \D \w \W \s \S
匹配重复 : * + ? {n} {m,n}
匹配位置 : ^ $ \A \Z \b \B
其他: | () \

正则表达式转义
正则中的特殊符号: . * + ? ^ $ [] () | \
在正则表达式中如果需要匹配特殊符号则需要加\作为转义
例如: 匹配. 需要使用\.
In [14]: re.findall("Mr.Liu","Mr.Liu")
Out[14]: ['Mr.Liu']

In [15]: re.findall("Mr.Liu","MrALiu")
Out[15]: ['MrALiu']

In [16]: re.findall("Mr\.Liu","Mr.Liu")
Out[16]: ['Mr.Liu']
正则 目标字符串
\$\d+ $10
python \\$\\d+ $10
* 字符串加r后为原始字符串,python不会对字符串中内容的特殊字串进行转义
"\\$\\d+"---->r"\$\d+"

贪婪和非贪婪
贪婪模式:正则表达式的重复匹配默认总是尽可能向后匹配更多的内容
* + ? {m,n}
非贪婪(懒惰模式): 尽可能少的重复匹配内容
贪婪---->非贪婪 *? +? ?? {m,n}?
In [17]: re.findall("ab*?","abbbbbbbbbbbbcc")
Out[17]: ['a']

In [18]: re.findall("ab+?","abbbbbbbbbbbbcc")
Out[18]: ['ab']

In [19]: re.findall("ab??","abbbbbbbbbbbbcc")
Out[19]: ['a']

In [20]: re.findall("ab{2,4}?","abbbbbbbbbbbbcc")
Out[20]: ['abb']

正则表达式分组:
使用() 可以为正则表达式建立内部分组,子组为正则表达式的一部分,可以看作一个内部整体
* 有子组的正则表达式仍然是整体去匹配内容,子组需在整体能够匹配到内容的前提下发挥作用
子组的作用:
1.作为内部整体可以改变某些元字符行为
2.子组在匹配到内容的情况下可以单独提取

In [22]: re.search("(ab)+","ababababab").group()
Out[22]: 'ababababab
In [24]: re.search("(ab)+\d+","ab1234").group()
Out[24]: 'ab1234'

In [25]: re.search("(ab)+\d+","abab1234").group()
Out[25]: 'abab1234'
In [26]: re.search(r"\w+@\w+\.cn","Liur@163.cn").group()
Out[26]: 'Liur@163.cn'

In [27]: re.search(r"\w+@\w+\.(cn|com)","Liur@163.com").group()
Out[27]: 'Liur@163.com'

In [30]: re.search(r"(https|http|ftp)","https://www.baidu.com").group(1)
Out[30]: 'https'

子组注意事项:
1.一个正则表达式中可以有多个子组
2.子组一般由外到内,由左到右,记为第一第二..子组
3.子组不要重叠或者嵌套过多
捕获组和非捕获组
捕获组命名
格式:(?P<name>pattern)
In [31]: re.search(r"(?P<dog>ab)cd","abcdef").group()
Out[31]: 'abcd'

In [32]: re.search(r"(?P<dog>ab)cd","abcdef").group('dog')
Out[32]: 'ab'
作用: 名字可以表达一定的含义,也可以通过名字获取子组内容

正则表达式的设计原则
1.正确性: 能够正确的匹配出目标字符串
2.排他性: 除了要匹配的内容,尽可能不会匹配到其他内容
3.全面性: 尽可能对目标字串各种情况考虑全面,做到不遗漏

re 模块
regex = compile(pattern,flags = 0)
功能: 生成正则表达式对象
参数: pattern 正则表达式
flags 功能标志位,丰富正则表达式的匹配功能
返回值: 正则表达式对象

re.findall(pattern,string,flags = 0)
功能: 从目标字符串提取所有正则匹配内容
参数: pattern 正则
string 目标字串
flags 功能标志
返回值: 返回匹配到的内容列表
如果正则表达式有子组只获取子组中的内容

regex.findall(string,pos,endpos)
功能: 从目标字符串提取所有的正则匹配内容
参数: string 目标字串
pos 截取目标字符串起始位置
endpos 截取目标字符串终止位置
返回值: 返回匹配到的内容列表
如果正则表达式有子组只获取子组中的内容

re.split(pattern,string,flags)
功能: 使用正则表达式匹配部分切割目标字符串
参数: pattern 正则表达式
string 目标字串
flags
返回值: 列表,切割后的部分

re.sub(pattern,replaceStr,string,max,flags)
功能: 使用字符串替换正则匹配内容
参数: pattern
replaceStr: 替换的字符串
string 目标字符串
max : 最多替换几处, 默认替换全部
返回值: 返回替换后的字符串

re.subn(pattern,replaceStr,string,max,flags)
功能: 使用字符串替换正则匹配内容
参数: pattern
replaceStr: 替换的字符串
string 目标字符串
max : 最多替换几处, 默认替换全部
返回值: 返回替换后的字符串和替换了几处

re.finditer(pattern,string)
功能: 使用正则表达式匹配目标字符串
参数: pattern 正则表达式
string 目标字符串
返回值: 迭代对象

re.fullmatch(pattern,string,flags)
功能:绝对匹配目标字符串(要求全部匹配,否则返回None)
参数: pattern 正则
string 目标字串
flags 标志位
返回值: match 对象

re.match(pattern,string,flags)
功能:绝对匹配目标字符串(要求全部匹配,否则返回None)
参数: pattern 正则
string 目标字串
flags 标志位
返回值: match 对象(只匹配一处)

re.search(pattern,string,flags)
功能: 匹配目标字符串第一处匹配内容
参数: pattern 正则
string 目标字串
返回值: 第一处匹配内容

regex 对象的属性
pattern 代表的正则表达式
flags 表示标志位常量值
groups 表示有多少组
groupindex 生成捕获组名和对应第几组的键值对构成的字典

 

posted @ 2019-04-16 21:49  全宇宙第一帅  阅读(509)  评论(0编辑  收藏  举报