01-02 正则表达式
一、简介
#正则表达式定义
能够表示一定意义的【字符串】的组合就是正则表达式,正则表达式就是一个字符串
#正则表示式的来源
1.来源--unix操作系统。正则表达式 叫做posix (两个版本bre和ere)
2.prel, python等语言,都有独特的正则语法。叫做pcre正则
3.常用的两大正则 posix系列和pcre系列
4.prel语言使用【pcre】, c语言使用【posix】, php【pcre/posix】, python使用【pcre】
#正则的作用
1.字符串过滤:在字符串中获取需要的部分字符。
2.验证字符串:用户名,密码相关的输入框。
3.切割字符串:划分字符内容。
4.替换字符串:替换文章相关的信息。
5.爬虫中大量使用正则。
二、正则表达式的组成
'''
正则的组成:由原子,元字符及模式修正符组成 。【其他语言中可能存在定界符】
'''
#原子:
组成正则表达式的最小单位,一个正则表达式至少需要一个原子。
1.所有可见字符都是原子:a,b,c,d,A,B,C,D,你,我,他+—*&……%¥#@
2.所有不可见字符也是原子: ,
,
......(转义字符)
3.正则专用转义字符:
d 表示0~9之间任意【一个】字符 -> [0123456789]自定义原子列表格式
D 表示除了0~9之外的任意【一个】字符 -> [^0-9]自定义排除格式
s 表示任意【一个】空白字符 (空格(' '), 换页('f'), 换行('
'), 回车('
'), 水平制表符(' '),垂直制表符('v')) -> [
fv]自定义原子列表
S 表示任意一个非空白字符(可见字符) -> [^
fv ]自定义排除列 表格式
w 表示0~9a~zA~Z和_中的任意【一个】字符 -> [0~9a~zA~Z_]自定义列表 格式
W 表示除了0~9a~zA~Z和_之外的任意【一个】字符 -> [^0~9a~zA~Z_]自 定义排除列表格式
. 表示任意一个字符[除了
] [^
]
#元字符:[原子修饰符]
[] 自定义原子列表
表示自定义原子列表中的任意一个字符,如果多个字符在ascii码中连 续的,可以进行缩写。例如[0123456789] -> [0-9]
[] 自定义排除列表
表示自定义原子列表之外的任意一个字符如果多个字符在ascii码中连 续的,可以进行缩写。例如D ->[^0-9]
与数量相关的元字符
+ 表示1个或者多个修饰的原子 【1,正无穷】 {1,}
? 表示0个或者1个修饰的原子 【0, 1】 {0,1}
* 表示任意一个修饰的原子 【0, 正无穷】 {0,}
{m} 表示必须为m个修饰的原子
{m,n} 表示必须为m到n个修饰的原子 m,n都包含在内
{m,} 表示必须为m到正无穷个修饰的原子【m, 正无穷】
{,n} 表示必须为小于n个修饰的原子【0,n】
A 表示限定内容必须在整个字符串的开头部位
表示限定内容必须在整个字符串的结尾部位
^ 表示限定内容必须在整个字符串的开头部位,支持多行匹配模式
$ 表示限定内容必须在整个字符串的结尾部位,支持多行匹配模式
表示能够当做英文单词分割的字符,(除了字母和数字 都是词边界,汉 字作为字母处理)代表【一个】字符
B 表示不能够当作英文单词分割的字符(非词边界,就是字母和数字)代 表【一个】字符
| 表示选择关系,左右的完整内容二选一 非常重要
() 1.改变正则表达式中的优先级
2.将多个原子视为一个原子处理,方便使用元字符。
3.将匹配的内容当做模式单元进行存储
'''
额外补充:多行模式,如果字符串中包含
字符,则可以在匹配的时候使用 多行匹配模式,多行匹配模式就是将每一行当做独立的字符串进行匹配。
注意:多行模式需要使用模式修正符
'''
#模式修正符
设定匹配的一些额外的规则
re.A 或者写成re.ASCII 在ASCII模式下进行正则匹配
re.U 或者写成 re.UNICODE 在UNICODE模式下进行正则匹配(例如汉字也可以当做字母) 默认情况下
re.S 使得原子原子.可以匹配任意字符,包含
re.M 或者re.MULTILINE 匹配操作在多行模式下进行 都是^和$相关
re.X 或者re.VERBOSE 匹配的时候忽略正则表达式中的空格或者注释
re.I 或者re.IGNORECASE 匹配过程中忽略大小写
## 转义字符的应用
字符串:
\ ...
因为在正则的元字符和原子当中,使用了部分的符号作为语法,为了匹配这些符号的单纯字符,需要在正则表达式中加上即可去掉意义,获取字符。
##扩展正则语法
1.(?Limsux) 模式修正符的应用。自定义模式修正符,可以自由组合
2.(?:) 取消单元存储功能
3.(?P<name>) 自定义模式单元的名称 (html标签常用)
4.(?P=name) 获取自定义模式单元的名称
5.(?#) 正则注释内容,解析器不会处理
6.(?=) 正向先行断言 (零宽断言)
7.(?!) 负向先行断言 (零宽断言)
8.(?<=) 正向后行断言 (零宽断言)
9.(?<!) 负向后行断言 (零宽断言)
10.(?(id/name)Y|N) 根据模式单元是否存在决定使用Y的规划(模式单元存在)或者是N的规划(模式单元不存在)
三、re模块
###正则表达式本质是字符串,单独使用没有意义的。正则表达式需要配合正则相关的函数和方法
###步骤
'''
#1.导入re模块
import re
##search方法:查找符合正则表达式的内容
#2.准备正则表达式
pattern = r'baidu' (r模式,取消转义字符的意义。比如\,s这些)
#3.正则查找的字符串
url = 'http://www.baidu.com'
#4.匹配操作
result = re.search(pattern, url)
print(result)
'''
匹配过程是拿着 pattern到url进行挨个字符串的匹配
'''
#结果
<_sre.SRE_Match object; span=(11, 16), match='baidu'>
'''
###re模块的方法
re.compile()
re.escape()
re.findall()
re.finditer()
re.match()
re.search()
re.split()
re.sub()
re.subn()
re文档