正则表达式

一:定义:正则表达式通常用来检索、替换那些符合某个模式(规则)的文本。

二:目的:检索和替换想要获取的内容

三:用到的两个东西:

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值