工具:https://tool.oschina.net/
学习视频:Python进阶-正则表达式
正则表达式是用于字符串提取,在爬虫、数据分析中经常使用到
一、re模块常用函数
match、group
result=re.match(正则表达式,匹配的字符串) reusult=group()#提取数据
二、表达方式字符
| . | 表示任意字符,除了n |
|---|---|
| [ ] | 列举字符,[1,2,3,4,5] |
| d | 表示数字类型 |
| D | 表示非数字类型 |
| s | 空格类型 |
| S | 非空格 |
| w | 表示单词类型 |
| W | 非单词类型 |
【】->[^129] 表示的是不是1、2、9这三个数 【a-z5-9】 表示范围
三、描述量
| * | + | ? | {m} | {m,} | {m,n} |
|---|---|---|---|---|---|
| 任意一个字符出现了n次 | 出现了n>=1 | 出现一次或0次 | 出现m次 | 至少出现m次 | 前一个字符号出现m~n次 |
r=re.match{"d*","a"}
r.group(1)
结果:' '
#d提取的是数字类型,*提取n次,不过目标不是数字
#所以'a'='''a',前面有一个‘’空白给正则表达式了
re.match{"\\abc",s}==\abc#在这里想拿到\abc却要用4个会比较麻烦
#原因:在使用正则时,把默认为了转义字符了,所以要用double个
解决办法:
re.match{r“\abc”,s}#使用一个r
四、边界区分
| ^ | $ | b | B |
|---|---|---|---|
| 匹配字符串的开头 | 匹配结尾 | 匹配一个单词的边界 | 匹配一个非单词的边界 |
(r"^w+ sbveb", "ho ve r")=="ho ve") (r"^.+ bveb", "ho ve r")=="ho ve")
五、匹配分组(扩展)
| I | (ab) | num | (?p | |
|---|---|---|---|---|
| 表达式或语句 | 将括号中字符作为分组 | 引用分组num匹配到字符串 | 给分组其别名 | 引用别名到字符串中 |
六、re库的其他函数
1、Search函数:搜索
2、findall函数:统计
3、Sub函数:替换
re=re.sub(r"d+",'888',"Python=123") 结果:python=888
4、split函数:切割字符串
re.split(r":| " ,"info:wupeilin 18 year") print (ret) 结果:info wupeilin 18 year
七、贪婪模式**
为什么会出现贪婪模式?因为在正则表达式里,会尽可能的满足公式,这样的话,就会出现“数据爬多或者结构混乱”
解决办法:
使用?将贪婪模式转变成非贪婪模式
s=“This is a nnumber 234-23-34-2” re.match(r".+(d+-d+-d+-d+)",s) r.group() 结果: 234-23-34-2 ②re.match(r"(.+)(d+-d+-d+-d+)",s) 结果:‘This is a nnumber 23’ ‘4-23-34-2’ #(.+)取任意字符至少1个,从This~nnumber, #因为贪婪模式,尽可能在满足表示式的前提下,爬取更多的信息,所以到23才停下来 #接下来就是d+的主场了,继续爬取消息 ③re.match(r"(.+?)(d+-d+-d+-d+)",s) 结果:‘This is a nnumber ’ ‘234-23-34-2’ #在(.+)加上个‘?’,将贪婪模式关闭掉,这样的话,就可以在ber上,正则表达式转化为(d+-d+-~~)



