正则表达式是处理字符串的强大工具,主要用于检索、查找、替换,在爬虫里主要用于解析HTML页面信息。
1.正则表达式模式
\w 匹配字母,数据及下划线
\W 匹配不是字母,数据及下划线
\s 匹配任意空白字符,等价于[\t\n\f]
\S 匹配任意非空字符
\d 匹配任意数据,等价于[0-9]
\D 匹配任意非数字字符
\A 匹配字符串开头
\Z 匹配字符串结尾,如果存在换行,只匹配到换行前结束的字符串
\z 匹配字符串结尾,如果存在换行,还会匹配换行后的字符串
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配一行字符串的开头
? 匹配0个或1个前面的表达式定义的片段,非贪婪
$ 匹配一行字符串的结尾
. 匹配任意字符串,除了换行符
[...] 用来表示一组字符,单独列出 比如[amk] 匹配a、m、k
[^...] 不在[ ]中的字符 比如[^abc] 表示匹配除了a、b、c 之外的字符
{n} 精确匹配n个前面的表达式
{n,m} 匹配n到m次前面表达式定义的内容,贪婪方式
a|b 匹配a或b
( ) 匹配括号内的表达式,也表示组
2.常用函数
- re.match
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None(简单来说就是从起始位置开始匹配,不管最后成不成功只要起始位置没有匹配成功就返回 None)
re.match(pattern, string, flags=0)
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等
- re.search
re.search 扫描整个字符串并返回第一个成功的匹配(很好理解~~~)
re.search(pattern, string, flags=0)
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位
匹配成功re.search方法return一个匹配的对象,否则返回None。
-re.match与re.search的区别
1.re.match只匹配字符串的开始,如果字开始匹配失败,函数返回None
2.而re.search匹配整个字符串,直到匹配成功
- re.sub
主要用于部分字符串的替换
re.sub(pattern, repl, string, count=0, flags=0)
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数,如果去电的话 可以为空。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配
content = re .sub (’\d+',”, content) 去掉content中的所有数字
- re.compile
该将正则表达式编译成一个正则表达式对象,以便复用(就是相当于我把规则定义出来,以后想用到同样的规则,只要调用就好了)给正则表达式做了一层封装,以使我们更好地复用
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
re.compile(pattern[, flags])
pattern : 一个字符串形式的正则表达式
flags (修饰符): 可选,表示匹配模式
修饰符
1.re.I 忽略大小写
2.re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
3.re.M 多行模式
4.re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
5.re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
6.re.X 为了增加可读性,忽略空格和 # 后面的注释
7.网页匹配中常用的是 re.S re.I
- re.findall
在字符串中查找正则表达式匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表,列表的里的每个元素都是元祖,可以用索引取出
findall(string[pos[, endpos]])
string : 待匹配的字符串。
pos : 可选参数,指定字符串的起始位置,默认为 0。
endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度
- re.finditer
返回一个迭代器类型,里面包含所有符合表达式的值,循环遍历输出每个值
it=re.finditer(pattern, string, flags=0)
for match in it:
print (match.group())
- re.split
按照能够匹配的子串将字符串分割后,return列表类型
re.split(pattern, string[, maxsplit=0, flags=0])
re.split('\W+', 'runoob, runoob, runoob.')
['runoob', 'runoob', 'runoob', '']
另外对于一个匹配失败的子串,split不会出现分割
- 贪婪模式
String str="abcaxc";
Patter p="ab.*c";
正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配,也就是匹配ab到c之间所有满足条件的字符串。abcaxc(ab.*c)
- 非贪婪匹配
String str="abcaxc";
Patter p="ab.*c";
尽量少匹配,匹配ab到c之间满足条件的第一个子串。abc(ab.*c)
- 如何区分贪婪模式和非贪婪模式
默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式
量词:{m,n}:m到n个
1.*:任意多个
2.+:一个到多个
3.?:0或一个
- 通用匹配
将中间部分直接省略,全部用 .* 来代替或者 .?
result = re.match (’'Hello.Demo$', content) .group()
Hello 123 4567 World This is a Regex Demo
- 其他
1.函数.span() 返回匹配范围
2.函数.start 开始位置 .
3.函数.end 结束位置
4.函数.group() 输出匹配结果
5.函数.group(1)取出匹配的一个字符,里面加索引
网友评论