#原子:
\d 表示0~9之间的任意【一个】字符->[0-9]自定义原子列表
\D 表示除了0~9之外的任意【一个字符】->[^0-9]自定义排除列表
\s 表示任意【一个】空白字符(不可见字符)->[\n\r\t\v\f]自定义原子列表
\S 表示任意【一个】非空白字符(可见字符)->[^\n\r\t\v\f]自定义排除列表
\w 表示0~9 a~z A~Z和__中的任意【一个】字符->[a-z0-9A-Z]自定义原子列表
\W 表示除了0~9 a~z A~Z和__之外的任意【一个】字符->[^a-z0-9A-Z]自定义排除列表
. 表示任意【一个】字符,除了\n
#元字符 [自定义原子列表]
[]自定义原子列表
表示自定义原子列表中的任意一个字符
与数量相关的原子符
+ 表示1个以上的修饰原子 {1,}
? 表示0个或者1个修饰的原子 {0,1}
* 表示任意一个修饰的原子 {0,}
{m} 表示必须是m个修饰的原子
{m,n} 表示修饰的原子数量是m到n之间的数量都可以(包含m,n)
{m,} 表示修饰的原子数量是m个到正无穷(包含m)
{,n} 表示修饰的0-n的修饰原子(包含0也包含n)
\A 表示限定内容必须在整个字符串的开头部位
\Z 表示限定内容必须在整个字符串的结束部位
^ 表示限定内容必须在整个字符串的开头部位 支持多行匹配
$ 表示限定内容必须在整个字符串的结束部位 支持多行匹配
\b 表示能够当做英文单词分割的字符,(除了字母和数字 都是词边界,汉字作为字母处理)
\B 表示不能够当做英文单词分割的字符(非词边界,就是字母和数字)代表一个字符【代表一个字符】
| 表示选择关系 左右的内容二选一
() 1.改变正则表达式中的优先级
2.将多个原子视为一个原子处理,方便使用元字符【可以叫做组或者模式单元】
3.将匹配的内容做模式单元进行存储
额外补充:多行模式,如果字符串中包含\n则可以在匹配的时候使用多行匹配模式
多行匹配模式就是将每一行当做独立的字符串进行匹配
注意:多行模式需要使用模式修正符
#模式修正符
设定匹配的一些额外的规则
re.A 或者 re.ASCII 在ASCII模式下进行操作
re.U 或者 re.UNICODE 在UNICODE模式下进行正则匹配操作 默认情况下
re.S 使得原子.可以匹配任意字符包含\n
re.M 或者 re.MULTILINE 匹配操作在多行模式下进行 都是与^和$相关
re.X 或者 re.VERBOSE 匹配的时候忽略正则表达式中的空格或者注释
re.I 或者 re.IGNORECASE 匹配过程中忽略大小写
\转意字符的应用
字符串:\n \r \t \\ ...
因为在正则的元字符和原子当中,使用了部分的符号作为语法,为了匹配这些符号的单纯字符
在正则表达式用,添加\即可去掉意义,获取字符
扩展正则语法
1. (?Limsux) 模式修正符的应用
2. (?:) 取消单元存储功能
3. (?P<name>) 自定义模式单元的名称
4. (?P=name) 获取自定义模式单元的内容
5. (?#) 正则注释内容 解析器不会处理
6. (?=) 正向先行断言 (零宽断言)
7. (?!) 负向先行断言 (零宽断言)
8. (?<=) 正向后行断言 (零宽断言)
9. (?<!) 负向后行断言 (零宽断言)
10. (?(id/name)Y|N) 根据模式单元是否存在决定使用Y规则(模式单元存在)或者是N的规则(模式单元不存在)
#re模块的方法
complie()1.编译正则表达式获取正则表达式对象 2.可以循环利用,提高程序效率
格式: re.complie(正则字符串,模式修正符)
返回值:正则对象
escape() 对字符串进行转意处理。仅处理非数字和字母的字符
格式: re.escape(字符串)
返回值:字符串
findall() 对字符串进行正则匹配 获取所有匹配的内容结果
格式: re.findll(正则表达式,字符串,模式修正符)
返回值:列表
finditer() 对字符串进行正则匹配 获取所有匹配的结果对象
格式: re.finditer(正则表达式,字符串,模式修正符)
返回值:包含所有匹配结果的迭代器
match() 对字符串的开头进行正则匹配,匹配到第一个结果停止匹配。
格式: re.match(正则表达式,字符串,模式修正符)
返回值:匹配结果对象
search() 对字符串任意位置正则匹配 匹配到第一个结果停止匹配,返回结果对象
格式: re.search(正则表达式,字符串,模式修正符)
返回值:匹配结果对象
split() 使用正则表达式切割字符串
格式: re.split(正则表达式,字符串,切割次数)v
返回值:返回一个列表
sub() 正则替换
格式: re.sub(正则表达式,替换的字符换,匹配的字符串,替换次数)
返回值:替换后的字符串
subn() 正则替换
格式: re.subn(正则表达式,替换的字符换,匹配的字符串,替换次数)
返回值:替换后的字符串和替换次数组成的元祖
爬虫(.*?)大法:
import re
str1 = 'xa6</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 '
presson = r'ref=(.*?)>About'
content = re.findall(presson,str1)
print(content[0]) #输出为:http://ir.baidu.com
把待匹配的字符替换为(.*?),前后加的字符越多匹配越准确。
原理:找(.*?)前后的字符,如果相同与相匹配的字符则返回。
缺点:这种表达式的匹配不够严谨