python:正则表达式
正则表达式:检索、替换那些符合某个模式的文本(比起那些复杂的代码筛选,正则表达式运行速度更快而且代码简洁得多)
正则表达式模块 re
创建正则表达式对象: re.complie("字符串形式表达式",模式(可选))
使用表达式对象匹配字符:
1.表达式对象.math(被检索字符串,模式(可选))
2.表达式对象.search(被检索字符串,模式(可选))
math()与search()区别是:math()只匹配字符串开头 若不符合正则表达式返回None
而search()匹配整个字符串 直到遇到匹配项 否则返回None
3.表达式对象.findall(被检索字符串,字符串起始位置,字符串结束位置) 默认起始位置0 默认字符串结束位置字符长度
与math()与search()不同 findall()检索匹配后会继续匹配直至结束 并将匹配项放置元组中并返回
(math与search返回的是math对象,而findall返回的是元组)若正则表达式用分组,则元组项为一个包含分组匹配的列表
例子 import re
user_phone="我的手机号码为:1539-0301-3039 他的电话号码是:1588-996-0020"
num_re=re.compile(r'(\d\d\d\d)-(\d\d\d)-(\d\d\d\d)')
phone_num=num_re.findall(user_phone)
返回元组为 [('1539', '0301', '3039'), ('1588', '996', '0020')]
若无表达式对象匹配字符:
1.re.math("字符串形式表达式",被检索字符串,模式(可选))
2.re.search("字符串形式表达式",被检索字符串,模式(可选))
返回匹配字符:
math与search匹配成功后会返回一个math对象
1.math对象.group(数字(默认0)) 返回表达式指定分组的匹配字符 0表示全部
2.math对象.groups() 返回表达式各分组匹配字符串组成的元组
group() 1123456789@qq.com 返回匹配字符分组字符 默认0返回全部
groups() ("1123456789","@","qq",".com") 返回匹配字符分组组成的元组
findall() [("1123456789","@","qq","com"),("1123456789","@","163","com")]
将所有匹配字符放入列表 若有分组则形成一个二维列表
模式表
re.I 忽略大小写
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M 多行模式
re.S 即为' . '并且包括换行符在内的任意字符(' . '不包括换行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
re.X 为了增加可读性,忽略空格和' # '后面的注释
正则表达式匹配更多模式
括号分组:将表达式分成多个部分 如"(\d\d\d)-(\d\d\d)-(\d\d\d)" 分成多个部分
或(|)管道:对正则表达式使用或操作 如"max|min" 将匹配max或者min 对组也可以使用管道
?可选匹配:表示可选匹配 如"(ABC)(123)?" 表示(123)组为可选项 有的话匹配没有的话也不影响
* 匹配零次或多次 如"(\d\d\d)*" 表示(\d\d\d)组可匹配零次或多次
+匹配一次或多次 如"(\d\d\d)+" 表示(\d\d\d)组可匹配一次或多次
{}指定匹配次数 如(ha){5} 表示匹配5次ha
(ha){,5} 表示匹配0-5次ha
(ha){5,} 表示匹配5-无数次ha
(ha){3,5} 表示匹配3-5次ha
(ha){3,5}=(r'(ha)(ha)(ha) | (ha)(ha)(ha)(ha) | (ha)(ha)(ha)(ha)(ha) ')
贪心匹配与非贪心匹配
在字符串"hahahahaha"中(ha){3,5}表达式会默认是会匹配最长字符---->贪心匹配
在字符串"hahahahaha"中(ha){3,5}?表达式会匹配最短字符 ----->非贪心匹配
即?在正则表达式中有两种含义:1.或2.非贪心匹配
字符分类:字符的范围
python内置:
\d:表示 0-9的数字
\D:表示除了0-9之外的所有字符
\w:字母、数字、下划线
\W:除字母、数字、下划线以外的字符
\s:表示空白字符(空格 制表符 换行符)
\S:除空白的之外的字符
自定义字符分类:
[]:表示范围
例:[a-zA-Z0-9]{11} 表示可匹配a-z A-Z与数字0-9 且长度为11的字符
^:1.表示异 2.表示匹配开头
例:^[a-zA-Z] 表示开头第一个必须是字母
[^a-zA-Z] 表示匹配非字母
$:表示末尾
例:$[0-5] 表示末尾必须为0-5的数字
通配符:
1: .可以匹配除换行符以外的所有单个字符
2: (.*)可以匹配所有字符
注:(.*)是贪心匹配默认会尽可能匹配字符
如"<ab>c>" <.*>-------><ab>c>
"<ab>c>" <.*?>-------><ab>
让通配符匹配换行符
re.DATALL作为re.complie()第二个参数
用正则表达式替换字符:
re.sub(正则表达式,替换字符串,被匹配字符串)
表达式对象.sub(替换字符串,被匹配字符串)