re.match
re.match
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
1 | content = '2005-2018 douban.com, all rights reserved 北京豆网科技有限公司' |
1 | # 输出结果: |
re.match从字符串的开头匹配
(将常规匹配中表达式 改成 005-\d{4}...
都不能匹配成功)
group与groups的用法:
group()
查看正则式所匹配内容group(1)
查看正则式中第一个括号里面的内容groups()
将正则式中所有括号里面的内容组成一个tuple,提取字符串要用切片的方法result.groups()[0]
group()
里面的参数是从1开始的,不是0。
re.search
re.search匹配整个字符串,直到找到一个匹配
!!!为了匹配方便,能用search就不用match
1 | result1 = re.search('2018.*(\w{6})', content) |
1 | result2 = re.search('2018.*?(\w{6})', content) |
区别:
匹配目标(\w{6})
是想截取2018以后的连续6个字母数字及下划线
规则.*
,尽可能多的匹配到中间的字符,只剩下最后6个字符作为匹配目标
规则.*?
,却截取与匹配目标最接近的6个字符
re.findall
案例:正则式爬取豆瓣图书相关信息
先获得单个html源码
1 | url = 'https://book.douban.com/top250?icn=index-book250-all' |
re.finditer
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回
1 | results = re.finditer('title="(\w+)".*?<p class="pl">.*?(\d{2}\.\d{2}).*?</p>', content, re.S) |
re.compile
用于编译正则表达式,生成一个正则表达式(Pattern)对象,作为参数供其他re模块函数使用
- 以findall改编一下:
1 | pattern = re.compile('title="(\w+)".*?<p class="pl">.*?(\d{2}\.\d{2}).*?</p>', re.S) |
re.sub
用于替换字符串中的匹配项
- 找出连续4个数字,替换为
hello welcome
1 | content = '2005-2018 douban.com, all rights reserved 北京豆网科技有限公司' |
输出结果为
1 | > hello welcome-2018 douban.com, all rights reserved 北京豆网科技有限公司 |
- 1表示匹配一次,所以只有2005替换了
- 参数默认为0,表示符合条件的,全部替换
- 替换括号内的内容
1 | result = re.sub('(\d{4})-(\d{4})', r'\2 welcome', content) |
输出结果为:
1 | > 2018 welcome douban.com, all rights reserved 北京豆网科技有限公司 |
- 按照括号顺序,可以将匹配内容调用到替换内容中, eg.
r'\2 ...'