正则表达式
应用场景
特定规律字符串的查找替换切割等
邮箱格式 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: 根据字符串生成正则表达式的对象, 用于特定正则匹配, 通过 matchsearchfindall 匹配
- # 根据字符串生成正则表达式的对象, 用于正则匹配
- c = re.compile(abc)
- # 然后进行特定正则匹配
- # m = c.match(abcdefghijklmn)
- m = c.search(abcdefghijklmn)
- if m:
- print(m)
- ?
- print(c.findall(abcueywiabcsjdkaabc))
将 re 模块中的 matchsearchfindall 方法的处理过程分为了两步完成
正则规则
单个字符
普通字符: 就是一对一的完全匹配
[]: 中间的任意一个字符
[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(rabc$)
- # 同时限制开头和结尾
- c = re.compile(r^abc$)
- ?
- s = c.search(abc)
- ?
- if s:
- print(ok)
- print(s.group())
分组匹配
|: 表示或, 具有最低的优先级
(): 用于表示一个整体, 可以确定优先级
- import re
- ?
- # | 表示或, 具有最低的优先级
- # () 用于表示一个整体, 可以确定优先级
- c = re.compile(ra(hello|world)d)
- ?
- s = c.search(aworldd)
- ?
- if s:
- print(ok)
- print(s.group())
() 还有分组匹配的作用, 下次再讲
练习:
若匹配有特殊正则含义的字符怎么办, 如:\d
友情提示: 转义问题 (python 中转义一次正则解析转义一次)
验证一个字符串是否是正确的邮箱格式
验证一个字符串是否是正确的 url 格式
思路
以功能为导向
写出符合规则的若干字符串
写一点测一点, 不断的调整
最终完成功能