Python爬虫之正则表达式
什么是正则表达式?
正则表达式是通过一些特殊的符号组成的字符串,这组字符串被称为模板;通过模板然后与目标串进行匹配,将与之相匹配的字符串取出。这就是正则表达式的作用
正则表达式的特殊字符
-
“ . ”符号可以匹配除换行符意外的任意一个字符
-
r = re.match(r'a.c', 'a你c').group() print(r) #a你c r = re.match(r'a.c', 'aBc').group() print(r) #aBc r = re.match(r'a.c', 'acc').group() print(r) #acc
-
-
“ | ”逻辑或字符
-
r = re.match(r'a|b', 'ab') print(r) #输出结果为:a r = re.match(r'a|b', 'a') print(r) #输出结果为:a r = re.match(r'a|b', 'b') print(r) #输出结果为:b r = re.match(r'a|b', 'ba') print(r) #输出结果为:b
-
-
“ ^ ” 取反符号,对字符集取反
-
r = re.match(r'速度与激情[^12345678]', '速度与激情9') print(r.group()) #输出结果为:速度与激情9
-
-
“ [] ” 匹配方括号中的一个字符
-
r = re.match(r'[abc]2', 'a2') print(r.group()) #输出结果为:a2
-
-
“ - ”区间符号如a-z匹配a到z中的任意一个字符
-
r = re.match(r'速度与激情[1-8a-z]', '速度与激情a') print(r.group()) #输出结果为:速度与激情a
-
-
“ \ ”对紧跟其后的一个字符进行转义
-
r = re.match(r'速度\.激情[1-8a-z]', '速度.激情a') print(r.group()) #输出结果为:速度.激情a
-
-
“ \d ” 匹配0-9中的任意一个数字
-
# r = re.match(r'[\d]*', '123') # print(r.group()) #输出结果为为:123
-
-
“ \D ”匹配除0-9数字之外的字符,相当于[^\d]
-
r = re.match(r'速度与激情\D', '速度与激情a') print(r.group()) #输出结果为:速度与激情a
-
-
“ \w ”匹配任意一个字符、数字、下划线
-
r = re.match(r'[\w]*', 'hfi') print(r.group()) #输出结果为:hfi
-
-
“ \W ”匹配除数字、字符、下划线意外的任意,相当于[^\w]
-
ptn = '\W-age' lst = ['1-age', 'A-age', '!-age', '_-age'] r = re.match(ptn, lst[2]) print(r.group()) #输出结果为:!-age
-
-
“ \s ”匹配制表符、空格、换行符等空白字符中的任意一个
-
r = re.match(r'\s', ' ') print(r.group()) #输出结果为:" " r = re.match(r'\s', '\n') print(r.group()) #输出结果为:" " r = re.match(r'\s', '\t') print(r.group()) #输出结果为:" "
-
-
“ \S ”相当于\s的取反操作,[^\s]
-
ptn = 'p\Sy' lst = ['p ysdf', 'pyyfdsfp yfds', 'p y', 'p_y'] r = re.match(ptn, lst[1]) print(r.group()) #输出结果为:pyy
-
-
“ {n} ”表达式重复n次,如\d{2} == \d\d;a{3} = aaa
-
ptn = '[\w]{6}' lst = ['hello', 'python', '#$%^&', '123456'] r = re.match(ptn, lst[1]) print(r.group()) #输出结果为:python
-
“ {n,} “表达式至少重复n次,可以是无限次
-
ptn = '[\w]{4,}' lst = ['sdiu', '48246', 'fasdfhasoduhtfouasdhfuhasiufhw9iuhfoasdhfiuasdhfuasdhiu', 'fds'] for list in lst: r = re.match(ptn, list) print(r.group()) #输出结果为: #sdiu #48246 #fasdfhasoduhtfouasdhfuhasiufhw9iuhfoasdhfiuasdhfuasdhiu #None
-
-
” {n,m} “表达式至少重复n次至多重复m次
-
ptn = '[\w]{3,6}' lst = ['hello', 'thang', '#$%^', '#$', '123456', '12_'] for list in lst: r = re.match(ptn, list) print(r.group()) #输出结果为: #hello #thang #None #None #123456 #12_
-
-
” ? “匹配表达式0次或1次
-
ptn = 'h[a-z]?' lst = ['hello', 'abc', 'xxx', 'h'] for lt in lst: r = re.match(ptn, lt) print(r) #输出结果为: #<re.Match object; span=(0, 2), match='he'> #None #None #<re.Match object; span=(0, 1), match='h'>
-
-
” + “表达式至少出现1次之多可以出现无限次
-
ptn = 'h[a-z]+' lst = ['hello', 'abc', 'xxx', 'h'] for lt in lst: r = re.match(ptn,lt) print(r) #输出结果为: #<re.Match object; span=(0, 5), match='hello'> #None #None #None
-
-
” * “表达式出现0次到无限次
-
ptn = 'h[a-z]*' lst = ['hellofsadugfiusdahufhsdufhs', 'abc', 'xxx', 'h'] for lt in lst: r = re.match(ptn, lt) print(r) #输出结果为: #<re.Match object; span=(0, 27), match='hellofsadugfiusdahufhsdufhs'> #None #None #<re.Match object; span=(0, 1), match='h'>
-
正则表达式的长用方法
-
match(pattern, string,flag=0)
- match()是从头开始匹配的
-
pattern:是正则表达式,如果匹配成功返回一个match()对象,如果匹配失败返回None
-
第二个参数表示要匹配的字符
-
是标致位用于控制正则表达式的匹配方式:如,是否区分大小写,多行匹配
-
strA = ‘python’
str = ‘pythonnand java’
r = re.match(strA, str)
print®
print(r.group())
print(r.start())
print(r.end())
print(r.span())
#输出结果为:
<re.Match object; span=(0, 6), match=‘python’>
python
0
6
(0, 6) -
-
compile(ptn, flag)
-
flag:
- re.A ASCll匹配
- re.I 匹配不区分大小写
- re.S 可以换行匹配
-
ptn = re.compile(r'abc', re.I) r = ptn.match('ABC123') print(r) #输出结果为: #<re.Match object; span=(0, 3), match='ABC'>
-
-
search()查找不用从文本开头开始
-
ptn = 'abc' string = '123abc567abc789' r = re.search(ptn, string) print(r.group()) #输出结果为; #abc
-
-
findall(ptn, str, flags)
-
ptn1 = 'abc' ptn2 = 'ABC' string = '123abc567abc789' r = re.findall(ptn1,string) print(r) z = re.findall(ptn2,string) print(z) #输出结果为; #['abc', 'abc'] #[]
-
-
split(ptn, str, maxsplit, flags)
-
r = re.findall(r'\d{1,}', '8+7*5+6/3')#['8', '7', '5', '6', '3'] print(r) #输出结果为:['8', '7', '5', '6', '3'] r = re.split(r'[\+\*/]', '8+7*5+6/3')#['8', '7', '5', '6', '3'] print(r) #输出结果为;['8', '7', '5', '6', '3'] r = re.split(r'[\+\*/]', '8+7*5+6/3', maxsplit=2)#['8', '7', '5+6/3'] print(r) #输出结果为:['8', '7', '5+6/3']
-
-
sub(oldstr, newstr, str[])
-
s = 'i am thaqy i am nice to meet you ! i like python' r = re.sub(r'i', 'I', s) print(r) #输出结果为:I am thaqy I am nIce to meet you ! I lIke python
-
分组功能
分组就是在匹配到的数据中再次筛选
例如:
题目需求是匹配到88和55
text = 'apple price is $88, orange price is $55'
r = re.search(r'.+(\$\d+).+(\$\d+)', text)
print(r.groups())
print(r.group(1))
print(r.group(2))
#输出结果为:
('$88', '$55')
$88
$55
位置匹配
-
" ^ "在字符串开始的地方匹配,符号本身不匹配任何字符
-
r = re.match(r'^abc', 'abcdef') print(r.group()) #输出结果为:abc
-
-
" $ "在字符串结束的地方匹配,符号本身不匹配任何字符
-
r = re.match(r'a.c$', 'abc') print(r.group()) #输出结果为:abc
-
贪婪匹配和非贪婪匹配
-
贪婪匹配
-
匹配
abc -
r = re.match(r'<div>.*</div>', '<div>abc</div><div>bcd</div>') print(r.group()) #输出结果为:<div>abc</div><div>bcd</div>
-
-
非贪婪匹配
-
r = re.match(r'<div>.*?</div>', '<div>abc</div><div>bcd</div>') print(r.group()) #输出结果为:<div>abc</div>
-