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爬虫学习记录基本库的使用——正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Python 爬虫正则表达式和re库,及re库的基本使用,提取单个页面信息

python爬虫学习记录基本库的使用——requests

python爬虫学习记录基本库的使用——urllib

Python3 爬虫Beautiful Soup库的使用

06 Python爬虫之Re(正则表达式)库

如何入门爬虫(基础篇)