1.正则表达式
(1)re的findall()方法
import re
r_list = re.findall('AB', 'ABCABDDGAAGDSGSDG') #后匹配前
print(r_list)
#输出:['AB', 'AB']
(2)也可以写作下面
import re
pattern = re.compile('AB')
r_list = pattern.findall('ABCABDDGAAGDSGSDG')
print(r_list)
2.常用元字符
. 任意一个字符(不包括\n)
\d 一个数字
\s 空白字符
\S 非空白字符
[] 包含[]内容
* 出现0次或多次
+ 出现1次或多次
\w+ 普通字符出现一次或多次
匹配任意一个字符的正则表达式:
(1)使用[\s\S]
pattern = re.compile('[\s\S]')
result = pattern.findall(html)
(2)使用re.S
pattern = re.compile('.‘,re.S)
result = pattern.findall(html)
re模块使用流程:
(1)方法1
r_list = re.findall('正则表达式',html,re.S)
(2)方法2
pattern = re.compile('正则表达式',re.S)
r_list = pattern.findall(html)
使用findall()方法得到的结果一定是列表,re.S作用为正则表达式元字符,. 可匹配\n在内的所有字符
3.贪婪匹配和非贪婪匹配
(1)贪婪匹配:在整个表达式匹配成功的前提下,尽可能多匹配 * + ?
表达式: .* .+ .?
(2)非贪婪匹配:在整个表达式匹配成功的前提下,尽可能多匹配 * + ?
表达式:.*? .+? .??
例子:
import re
html = '''
<div><p>XXXXXXXXX</div></p>
<div><p>XXXXXXXXXX</div></p>
'''
pattern = re.compile('<div><p>.*?</div></p>',re.S)
r_list = pattern.findall(html)
print(r_list)
pattern = re.compile('<div><p>(.*?)</div></p>',re.S)
r_list = pattern.findall(html)
print(r_list)
#只匹配XXX内容
##贪婪匹配</div></p>也会被认为任意字符,所有使用非贪婪匹配解决上面匹配特定内容问题
例子:
import re
html = 'A B C D'
pattern = re.compile('\w+\s+\w+',re.S)
r_list = pattern.findall(html)
print(r_list)
输出:['A B', 'C D']
import re
html = 'A B C D'
pattern = re.compile('(\w+)\s+\w+',re.S)
r_list = pattern.findall(html)
输出:['A', 'C']
总结:
在网页中想抓取什么内容,就在正则表达式中此位置加()
匹配时先按照整体正则匹配,然后再提取分组()中内容
2及以上分组(),则结果中以元组形式显示[(),(),()]