特定规律字符串的查找替换切割等
邮箱格式、url等格式的验证
爬虫项目,提取特定的有效内容
很多应用的配置文件
使用原则
只要能够通过字符串等相关函数能够解决的,就不要使用正则
正则的执行效率比较低,会降低代码的可读性
世界上最难读懂的三样东西:医生的处方、道士的神符、码农的正则
提醒:正则是用来写的,不是用来读的,不要试着阅读别人的正则;不懂功能时必要读正则。
基本使用
说明:正则是通过re模块提供支持的
相关函数:
match:从开头进行匹配,找到就立即返回正则结果对象,没有就返回None
search:匹配全部内容,任意位置,只要找到,立即返回正则结果对象,没有返回None
# python依赖次模块完成正则功能 import re # 从开头进行匹配,找到一个立即返回正则结果对象,没有返回None m = re.match('abc', 'abchelloabc') # 匹配全部内容,任意位置,只要找到,立即返回正则结果对象,没有返回None m = re.search('abc', 'helloabcshsjsldj') if m: print('ok') # 获取匹配内容 print(m.group()) # 获取匹配位置 print(m.span())
findall:匹配所有内容,返回匹配结果组成的列表,没有返回None
# 匹配所有内容,返回匹配结果组成的列表,没有返回None f = re.findall('abc', 'abcsdisuoiabcsjdklsjabc') if f: print(f)
compile:根据字符串生成正则表达式的对象,用于特定正则匹配,通过match、search、findall匹配
# 根据字符串生成正则表达式的对象,用于正则匹配 c = re.compile('abc') # 然后进行特定正则匹配 # m = c.match('abcdefghijklmn') m = c.search('abcdefghijklmn') if m: print(m) print(c.findall('abcueywiabcsjdkaabc'))
将re模块中的match、search、findall方法的处理过程分为了两步完成。
正则规则
单个字符
普通字符:就是一对一的完全匹配 []:中间的任意一个字符 [a-z]:表示a到z的任意字符 [0-9]:表示0到9的任意字符 [^abc]:除abc之外的字符 . :匹配'\n'以外的任意字符 \d:所有的数字字符,等价于[0-9] \D:所有的非数字字符,等价于[^0-9] \w:所有的数字、字母、中文、下划线等 (就是字的意思) \W:\w之外的所有字符 \s:所有的空白字符,如:空格、\t、\n、\r \S:\s之外的所有字符 \b:词边界,如:开头、结尾、标点、空格等 \B:非词边界
次数控制
*:前面的字符可以是任意次 +:前面的字符至少出现一次 ?:至多一次,0次或1次 {m}:匹配固定的m次 {m,}:至少m次 {m,n}:m到n次
正则的匹配默认是贪婪的
边界限定
^:以指定内容开头
$:以指定内容结尾
import re # 以指定内容开头 # c = re.compile(r'^abc') # 以指定内容结尾 # c = re.compile(r'abc$') # 同时限制开头和结尾 c = re.compile(r'^abc$') s = c.search('abc') if s: print('ok') print(s.group())
分组匹配
|:表示或,具有最低的优先级
():用于表示一个整体,可以确定优先级
import re # | 表示或,具有最低的优先级 # () 用于表示一个整体,可以确定优先级 c = re.compile(r'a(hello|world)d') s = c.search('aworldd') if s: print('ok') print(s.group())