一:定义:正则表达式通常用来检索、替换那些符合某个模式(规则)的文本。
二:目的:检索和替换想要获取的内容
三:用到的两个东西:
1.模式(规则)
2.文本
四、re 在爬虫中的应用:提取有用数据
import re
import requests
# match 匹配,必须从文本的头开始匹配
# search 搜索,可以从任意位置开始匹配
# .*?里的.是指任意字符,但只是一个字符,*代表前面的字符出现零次或者多次,问号表示懒惰模式,匹配一个就不匹配了
text = '<h>kkgig<h>'
text1 = 'sjlafdhoisf'
r_text = re.match('<h>(.*)(gig)<h>', text)
r_text1 = re.search('jla', text1)
print(r_text.group(1)) # 打印第一个括号里的内容
print(r_text.group(2))
print(r_text1.group(0))
import re
line = 'huang123'
# 1.以h开头
pattern = '^h'
# ^号代表必须以后面的字符作为开头
# 2.以h开头后面跟着一个字符
pattern = '^h.'
# 3.以h开头后面跟着任意数量的数字
pattern = '^h\d*'
# \d表示数字
# 4.以3结尾
pattern = '3$'
# $表示这个符号前面的内容是结尾的内容
# 5.以h开头,以3结尾,中间只有一个字符
pattern = '^h.3$'
# 6.以h开头,以3结尾,中间只有一个字符
pattern = '^h.*3$'
# .能够匹配到任意字符,除了:\n,如果需要,添加re.S的标志
response = re.match(pattern, line, re.S)
response = re.match(pattern, line)
print(response)
import re
line = 'hahahahaha'
# 1.匹配第一个h和第二个h之间的内容
# 2.使用非贪婪限定符
pattern = '^h.*?h'
# * 作为前面的字符出现多次的限定符,它是尽量多的匹配内容,贪婪模式
# ?就是非贪婪字符
res = re.search(pattern, line)
print(res)
# * 表示0到无穷个
# ?表示0到1个 如.?表示出现了0次或一次
# 如果?前面是字符,那么代表0-1个前面字符,如果前面是个数的限定符,就是非贪婪模式
# 获取h和h之间,需要包含特定数量字符的子串
pattern = 'h.{4,15}h' # h和h之间有4到6个字符,但这也是贪婪模式,加问号非贪婪
# 使用+表示h和h之间至少有一个字符
pattern = 'h.{1,}h' # 1,什么都不写,表示无穷
# .{1,} == +,+ 表示前面的字符出现1到无穷次
# {,}0-无穷
# + == {1,}
# * == {0,}
# ? == {0,1}
# h{5} == hhhhh
import re
line = 'sss127'
pattern = '(sss|127)'
# # | 表示或者的意思,哪个在前面线匹配到则匹配哪个
res = re.search(pattern, line)
print(res)
# []表示中括号内的字符可以被匹配 [123] = (1|2|3)
pattern = '[123]'
res = re.search(pattern, line)
# 数字是0-9, \d == [0123456789] == [0-9]
# 所有小写字母 [a-z] ,大写字母[A-Z]
# [a-zA-Z0-9_]表示数字字母下划线
# 表示邮箱 youxiang@163.com
# [a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.com
# 想要确切匹配之前的特殊字符,就需要加转义
# 用^表示非的功能
pattern = [^1]
# \s匹配任何空白字符,包括空格、制表符、换页符等等。== [\f\n\r\t\v]
# \S匹配任何非空白符。== [^\f\n\r\t\v]
# \w等价于[a-zA-Z0-9_]
# \W与\w相反
# \d表示所有数字 == [0-9]
match----从头匹配一个
search----从任意位置匹配一个内容
findall----全部匹配
finditer----全部匹配出内容,迭代器
compile----可以将模式定义成一个单独的类,重复使用
sub----替换内容
import re
pattern = '[a-zA-Z-]+'
line = 'I want to be a coder'
# findall的作用是找到所有的匹配项
# 返回值是所有找到内容的字符串的列表
words = re.findall(pattern, line)
print(words)
# finditer
# 返回值是一个迭代器,每次迭代的内容是SRE_MATCH
words = re.finditer(pattern, line)
for item in words:
print(item.group(0))
# compile的作用:能够生成一个类,这个类用于匹配数据,能够性更高
# 下面的两行代码相当于上面的一行search语句
pat = re.compile(pattern)
res = pat.search(line)
# 类的频繁创建和删除会造成很大的性能问题
# 如果循环匹配内容的话,就需要用到compile,一般用在循环中,compile提出来
# sub
res = re.sub(pattern, 'words', line)
import re
# 匹配所有单词的第一个字母
line = 'i love you'
pattern = "([a-zA-Z-])[a-zA-Z-]*"
res = re.findall(pattern, line)
print(res)