正则表达式
对文本内容的搜索,定位,提取是逻辑比较复杂的工作。
定义:
文本的高度匹配模式,其本质是由一系列字符和特殊符号构成号构成的字串,这个字串即正则表达式。
原理:
通过普通字符和有特殊含义的字符,来组成字符串,用以描述一定的字符串规则,比如:重复,位置等,来表达某类特定的字符串,进而匹配。
目标:
1. 熟练掌握元字符
2. 能够读懂常用正则表达式,编辑正则规则
3. 熟练使用re模块操作正则表达式
1. 单字匹配
- 元字符使用
- 普通字符,匹配其自身
元字符之外的字符,正则表达大python中也可以匹配中文- 或关系: 元字符:|
匹配规则: 匹配|两侧任意的正则表达即可 - 匹配单个字符: 元字符:.
匹配规则: 匹配除换行外的任意一个字符 - 匹配字符集: 元字符:[字符集]
匹配规则: 匹配字符集中的任意一个字符表达形式: [aeiou数据管理] 表示[]中的任意一个字符 [0-9],[a-z][A-Z] 表示区间内的任意一个字符 [#?0-9a-z] 混合书写,一般区间表达定在后面
- 匹配字符集反集: 元字符:字符集
匹配规则: 匹配除了字符集以外的任意一个字符2. 匹配重复元字符*:
匹配规则: 匹配前面的字符出现0次或多次
元字符+:
匹配规则: 匹配前面的字符出现1次或多次
元字符?:
匹配规则: 匹配前面的字符出现0次或1次
元字符{n}:
匹配规则: 匹配前面的字符出现n次
元字符{m,n}:
匹配规则: 匹配前面的字符出现m-n次3. 匹配位置匹配字符串开始位置:
元字符^:
匹配规则: 匹配目标字符串的开头位置
匹配字符串结束位置:
**元字符:** 匹配规则: 匹配目标字符串的结束位置 规则技巧:^和必须出现在正则表达的开头和结尾处。如果两者同时出现,则蹭的部分必须匹配整个目标字符串的全部内容4. 其它匹配任意(非)数字字符
元字符:\d 相当于[0-9] \D 相当于[^0-9]
匹配规则:\d匹配任意数字字符,\D匹配任意非数字字符
匹配任意(非)普通字符
说明:普通字符指数字、字母、下划线、汉字
元字符:\w \W
匹配规则:\w 匹配普通字符,\W 匹配非普通字符
匹配任意(非)空字符
说明:空字符指 空格\r \n \t \v \f 字符
元字符:\s \S
匹配规则:\s 匹配空字符,\S 匹配非空字符
匹配任意(非)单词的边界位置
说明:单词边界指数字字母(汉字)下划线与其他字符的交界位置
元字符:\b \B
匹配规则:\b 表示单词边界,\B 表示非单词边界5. 元字符分类类别元字符匹配字符. [...] [^...] \d \D \w匹配重复* + ? {n} {m,n}匹配位置^ $ \b \B其它| () \6. 特殊字符匹配
- 目的:如果匹配的目标字符串中包含正则表达式特殊字符,则在表达式中元字符就想表示其本身含义时就需要进行\处理。
- 特殊字符 . * + ? ^ $ [] () {}
操作方法:在正则表达式元字符前加\则元字符就是去其特殊含义,就表示字符本身7. 贪婪模式和非贪婪模式
- 特殊字符 . * + ? ^ $ [] () {}
- 定义贪婪模式:默认情况下,匹配重复的元字符总是尽可能多的向后匹配内容。比如:* + ? {m,n}非贪婪模式(懒惰模式):让匹配重复的元字符尽可能少的向匹配内容。
- 贪婪模式转换为非贪婪模式在对应的匹配重复的元字符后加"?"号即可
- 一定是符合规则的前提下。一般在左右配合时使用。8. 分组
- 定义在正则表达式中,以()建立正则表达的内部分组,子组是正则表达式的一部分,可以作为内部整体操作对象。
- 作用: 可以被作为整体操作,改变元字符的操作对象
- 捕获组 本质也是一个子组,只不过拥有一个名称用以表达该子组的意义,这种有名称的子组即为捕获组。格式:
(?Ppattern)
- 注意:
- 一个正则表达式中可以包含多个子组
- 子组可以嵌套但是不宜结构过于复杂
- 子组序列号一般从外到内,从左到右计数
- 或关系: 元字符:|
- 正则表达式匹配原则
- 正确性,能够正确的匹配出目标字符串。
- 排他性,除了目标字符串之外尽可能少的匹配其它内容。
- 全面性,尽可能考虑到目标字符串的所有情况,不遗漏。
Python re模块使用
——————————————————————————
1. 基础函数
以下为Python正则表达式常用函数:
re.findall(pattern,string)
功能:根据正则表达式匹配目标字符串内容
参数:pattern 正则表达式
string 目标字符串
返回值: 匹配到的内容列表,如果正则表达式有子组则只能获得到子组对应的内容
re.split(pattern,string,max)
功能:使用正则表达式匹配内容,切割目标字符串
参数:pattern 正则表达式
string 目标字符串
max 最多切割几部分
返回值:切割后的内容列表
re.sub(pattern,replace,string,count)
功能:使用一个字符串替换正则表达匹配到的内容
参数: pattern 正则表达式
replace 替换的字符串
string 目标的字符串
count 最多替换几处,默认替换全部
返回值:替换后的字符串
2. 生成match对象
re.finditer(pattern,string)
功能:根据正则表达式匹配目标字符串内容
参数:pattern 正则表达式
string 目标字符串
返回值:匹配结果的迭代器
re.match(pattern,string)
功能:匹配某个目标字符串开始位置
参数:pattern 正则
string 目标字符串
返回值:匹配内容match object
re.search(pattern,string)
功能:匹配目标字符串第一个符合内容
参数:pattern 正则
string 目标字符串
返回值:匹配内容match object
3. match对象使用
span()
功能:获取匹配内容的起止位置
group(n = 0)
功能:获取match对象匹配内容参数:默认为0表示获取整个match对象内容,如果是序列号或者组名则表示获取对应子组内容返回值:匹配字符串
