Python爬虫: 正则表达式

一般的正则表达式都可直接到正则生成工具处生成,
http://tool.oschina.net/regex/  为常用的在线正则表达式工具

常见匹配字符


re.match及其常规匹配
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
re.match(pattern, string, flags = 0)
返回的为一个对象,其中span代表长度 加上group方法会返回数据信息 加上span方法会返回长度

泛匹配

匹配目标
使用()来表示想要返回的group 其中第一个()为group(1),第二个为group(2)

贪婪匹配
贪婪模式中.* 会尽可能多的匹配,从而匹配了123456。贪婪模式为正则的默认匹配模式

非贪婪匹配
通过加上?,转换为非贪婪模式,从而尽可能少的匹配,如下例对于1234567,并无匹配,可以理解为,通过?让*.变的懒惰了
匹配模式
匹配模式即为flag参数. 下例中,由于不能匹配换行符,不配置flag会返回None;故需要将匹配模式变为re.S,*.即可匹配任意字符

转义
字符中会出现转义字符,如$,.等,需要通过加上反斜杠\来表示后面的字符为转义字符

总结:尽量使用泛匹配、使用括号得到匹配目标、尽量使用非贪婪模式、有换行符就用re.S

re.search
re.search 扫描整个字符串并返回第一个成功的匹配。相比于re.match,re.search不需要从第一个字符开始匹配。

案例1:
使用re.search筛选html内容


re.findall
从上例中,可以发现match和search都有一定的限制性,即不可以返回符合条件的所有字符。所以一般在进行爬虫时会使用findall方法会更多一点。findall方法会搜索字符串,以列表形式返回全部能匹配的子串。


改进:上例中,并没有筛选出第一条数据,这是由于第一条数据没有a标签
用\s ?表示换行(\s代表空白字符,  表示有一个或多个,?表示可有可没有)
用()可表示里面内容为一个整体,()?表示()内内容可有可无
results = re.findall('<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>', html, re.S)
print(results)
for result in results:
    print(result[1])

re.sub
替换字符串中每一个匹配的子串后返回替换后的字符串

import re
​
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
content = re.sub('\d+', '', content)
print(content)
Extra stings Hello  World_This is a Regex Demo Extra stings

​
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
content = re.sub('\d+', 'Replacement', content)
print(content)
Extra stings Hello Replacement World_This is a Regex Demo Extra stings
\1表示要被替换的第一个group
​
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
content = re.sub('(\d+)', r'\1 8910', content)
print(content)
Extra stings Hello 1234567 8910 World_This is a Regex Demo Extra stings
re.sub和re.findall共同配合进行信息提取
对于歌词的例子,实际上通过sub先将a标签删去再进行findall会更加简单
html = re.sub('<a.*?>|</a>', '', html)
print(html)
import re
​
)print(results)for result in results: print(result.strip())结果:一路上有你 沧海一声笑 往事随风 光辉岁月 记事本 但愿人长久
re.compile
re.compile将正则字符串编译成正则表达式对象
将一个正则表达式串编译成正则对象,以便于复用该匹配模式

content = '''Hello 1234567 World_This
is a Regex Demo'''
pattern = re.compile('Hello.*Demo', re.S)
result = re.match(pattern, content)
#result = re.match('Hello.*Demo', content, re.S)
print(result)
<_sre.SRE_Match object; span=(0, 40), match='Hello 1234567 World_This\nis a Regex Demo'>






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值