python爬虫之正则总结
使用
import re
match,正则中最基本的函数,用法:
result = re.match(pattern, 需要区配的字符串)
result.group()取出被区配到的部分
演示语法的时候,基本会用match函数演示。match区配的过程是:从左到右区配,直到出现不满足规则的时候停止
语法
表示字符
. 区配任意一个字符(除\n)
[] 区配[]中列举的字符
\d 区配数字,0-9
\D 区配非数字
\s 区配空白,(包含空格和Tab键)(\t \n 空格)
\S 区配非空白
\w 区配单词字符,a-z,A-Z,0-9,_
\W 区配非单词字符
表示个数
- 限定前一个字符出现0次或n次
- 限定前一个字符出现1次或者n次
? 限定前一个字符出现0次或1次
{m} 限定前一个字符出现m次
{m,} 限定前一个字符至少出现m次
{m,n} 限定前一个字符出现m到n次
表示边界
^ 表示字符串开头
$ 表示字符串结尾
\b 表示单词的边界
\B 表示非单词边界
区配分组
| “或”,表示符合左右任意一个都可以
(ab) 将括号中字符作为一个分组
\num 引用分组num区配到的字符串
(?P) 分组起别名
(?P=name) 引用别名为name分组区配到的字符串
re的高级用法
1.search:与match不同,match是从左到右,必须挨个符合;而search表示只要被区配的字符串中有符合的就返回,但是,只返回第一次满足要求的内容。
需求:匹配出文章阅读的次数
import re
ret = re.search(r"\d+", "阅读次数为 9999")
ret.group()
运行结果:
'9999'
2.findall():返回被区配字符串中所有的符合要求的内容,返回列表型
需求:统计出python、c、c++相应文章阅读的次数
import re
ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret)
运行结果:
['9999', '7890', '12345']
3.sub():将区配到的内容,按照指定的方式替换(批量处理)
需求:将匹配到的阅读次数加1
方法1:
#coding=utf-8
import re
ret = re.sub(r"\d+", '998', "python = 997")
print(ret)
运行结果:
python = 998
方法2:
#coding=utf-8
import re
def add(temp):
strNum = temp.group()
num = int(strNum) + 1
return str(num)
ret = re.sub(r"\d+", add, "python = 997")
print(ret)
ret = re.sub(r"\d+", add, "python = 99")
print(ret)
运行结果:
python = 998
python = 100
贪婪与非贪婪
python中的正则,默认贪婪模式。表示在区配过程中,会尽可能多的去区配内容。如果需要关闭贪婪模式,加上一个?符号
注意项
1.这些特殊字符,需要反斜杠转义\ . ^ $ ? + * {} [] () |
2.建议字符串和正则规则都加上r,减少考虑字符串转义的麻烦