python爬虫学习记录基本库的使用——正则表达式
Posted 玛卡巴卡巴巴亚卡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python爬虫学习记录基本库的使用——正则表达式相关的知识,希望对你有一定的参考价值。
正则表达式测试工具:http://tool.oschina.net/regex
1、常见语法
https://www.runoob.com/regexp/regexp-syntax.html
2、match()
用match传入要匹配的字符串以及正则表达式,就可以及检测这个正则表达式是否匹配字符串。
import re
content = 'Hello 123 4567 World_This is a Regex Demo'
print(len(content))
result = re.match('^Hello\\s\\d\\d\\d\\s\\d{4}\\s\\w{10}',content)
print(result)
print(result.group())
print(result.span())
41
<re.Match object; span=(0, 25), match='Hello 123 4567 World_This'>
Hello 123 4567 World_This
(0, 25)
正则表达式^匹配字符串开头,以Hello开头;\\s匹配空白字符;\\d匹配数字,3个\\d匹配123;\\s匹配空格;4567用四个\\d匹配,用{4}来表示匹配4次;紧接一个空白字符,最后用\\w{10}匹配10个字母以及下划线。
(1)匹配目标
如果想从字符串中提取一部分内容,可以使用()把想提取的子字符串括起来。()标记一个子表达式开始和结束的位置,被标记的每个子表达式会一次对应每个分组,调用group()方法传入分组的索引即可获取提取的结果。
(2)贪婪与非贪婪匹配
贪婪匹配:.*
import re
content = 'Hello 123 4567 World_This is a Regex Demo'
result = re.match('^He.*(\\d+).*Demo$',content)
print(result)
print(result.group(1))
<re.Match object; span=(0, 41), match='Hello 123 4567 World_This is a Regex Demo'>
7
.*会尽可能多的匹配字符,因为.*后是\\d+,意思是至少一个数字,没有具体多少个数字,于是就尽可能多的匹配字符,把123456匹配了,只留下一个7.
非贪婪匹配:.*?
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\\d+).*Demo$',content)
print(result)
print(result.group(1))
<re.Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
1234567
当.*?陪陪到hello后的空白字符,再往后就是数字,\\d+恰好可以匹配,.*?就不再匹配了,交给\\d+匹配后面的数字,1234567
尽量使用.*?,避免匹配结果出现缺失
但如果匹配的结果出现在字符串结尾,使用.*尽可能匹配多的内容
import re
content = 'http://weibo.com/comment/kEraCN'
result1 = re.match('http.*?comment/(.*?)',content)
result2 = re.match('http.*?comment/(.*)',content)
print('result1:',result1.group(1))
print('result2:',result2.group(1))
result1:
result2: kEraCN
(3)修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配模式。修饰符被指定为一个可选的标志。
import re
content ='''Hello 1234567 World_This
is a Regex Demo
'''
result = re.match('^He.*?(\\d+).*?Demo$',content)
print(result.group(1))
AttributeError: 'NoneType' object has no attribute 'group'
.匹配的是除换行符之外的任意字符,遇到换行时.*?就不能匹配了,这是需要添加re.S修饰错误。这个可以匹配节点之间的换行。
import re
content ='''Hello 1234567 World_This
is a Regex Demo
'''
result = re.match('^He.*?(\\d+).*?Demo$',content,re.S)
print(result.group(1))
此时又可以输出1234567。
re.I 匹配对大小写不敏感
re.L 做本地化匹配
re.M 多行匹配,影响^,$
re.S 使.匹配包括换行在内的所有字符
re.U 根据unicode字符集解析字符,这个标志影响\\w,\\W,\\b,\\B
re.X 通过给与更灵活的格式以便将正则表达式写得更易于理解
(4)转义匹配
用\\来转义特殊字符
import re
content ='(百度)www.baidu.com'
result = re.match('\\(百度\\)www\\.baidu\\.com',content)
print(result)
<re.Match object; span=(0, 17), match='(百度)www.baidu.com'>
3、search()
match是从字符串开头开始匹配。search是在匹配时会扫描整个字符串,返回第一个成功匹配的结果,正则可以使字符串的一部分。
import re
content = 'Extra string Hello 1234567 World_This is a Regex Demo Extra strings'
result = re.search('Hello.*?(\\d+).*?Demo',content)
print(result)
print(result[1])
<re.Match object; span=(13, 53), match='Hello 1234567 World_This is a Regex Demo'>
1234567
4、findall()
获取匹配正则表达式的所有内容,如果有返回结果,就是列表类型,需要遍历来一次获取每组内容。
5、sub()
可以修改文本
import re
content = '54K54yr5oiR54ix5L2g'
content = re.sub('\\d+','',content)
print(content)
结果如下
KyroiRixLg
第一个参数\\d+来匹配所有数字,第二个参数代表被替换成的字符串,第三个参数是原字符串。
可以通过sub方法处理,再用findall方法提取。
6、compile()
可以把正则字符串编译成正则表达式对象
import re
content1 = '2016-12-15 12:00'
content2 = '2016-12-17 12:55'
content3 = '2016-12-22 13:21'
pattern = re.compile('\\d{2}:\\d{2}')
result1 = re.sub(pattern,'',content1)
result2 = re.sub(pattern,'',content2)
result3 = re.sub(pattern,'',content3)
print(result1,result2,result3)
2016-12-15 2016-12-17 2016-12-22
我们想要把三个日期中的时间去掉,可以借助sub方法,把正则表达式用compile编译成一个对象pattern,最后使用sub方法替换即可。
以上是关于python爬虫学习记录基本库的使用——正则表达式的主要内容,如果未能解决你的问题,请参考以下文章