爬虫必备_正则表达式

什么是正则表达式

正则表达式(Regular Expression), 是一个模版字符串, 可以根据这个模版字符串, 对其它字符串进行匹配, 查找, 替换等操作

元字符(metacharacter)

正则表达式由一个或多个元字符组成

常见的元字符:

元字符描述
[ ]字符类(character class),匹配其中的任意一个字符
[a-z]字符a到z的任意一个
[^a]不是字符a,^需放在首位
*重复前一字符0+次,贪婪匹配(匹配尽可能多的字符)
*?重复前一字符0+次,非贪婪匹配(匹配尽可能少的字符)
+重复前一字符1+次,贪婪匹配
+?重复前一字符1+次,非贪婪匹配
?重复前一字符0或1次
{m,n}重复前一字符至少m次,至多n次,m默认0,n默认20亿,贪婪匹配
{m,n}?重复前一字符至少m次,至多n次,m默认0,n默认20亿,非贪婪匹配
.任意字符,除了\n
|或,匹配两侧的若干字符,优先级很低
hello | world匹配hello或者world,而不是在o和w之间取舍
^必须出现在正则表达式的开始处,表示匹配目标字符串的左侧(每行的开始处)
$必须出现在正则表达式的结尾处,表示匹配目标字符串的右侧(每行的结尾处)
()组,每一对括号即一个组,没有括号时只有一个默认组(group 0),其它组从group 1 开始
(?P<name>…)命名组,可用过name索引group
(?=…)正向前看断言,存在…则继续其它匹配,但不捕获…,否则匹配失败,不占宽度
(?!..)逆向前看断言,不存在…则继续匹配,不占宽度
(?:…)不捕获组,匹配但不捕获匹配的子串,占宽度
\g<n>向后引用group n
\g<name>向后引用group name
\n (?P=name) \g<name> \g<n>向后引用,引用指定组的值
\A只在整个目标字符串的开始处匹配
\Z只在整个目标字符串的结尾处匹配
\转义字符 常用raw字符串来阻止转义,否则需要\来表达转义字符(python字符串规则)
\w[a-zA-Z0-9] 所有数字字母
\W[^a-zA-Z0-9] 所有非数字字母
\d[0-9] 所有数字
\D[^0-9] 所有非数字
\s[ \t\n\r\f\v], 所有空白字符
\S[^ \t\n\r\f\v], 非空白字符
\b单词边界,即空白或其它非单词字符,不占宽度
\B非单词边界,不占宽度

编译标志

在使用正则表达式时, 可以指定编译标志来控制正则表达式的工作方式

标志描述
re.A, re.ASCII使\w\b\s\d仅匹配ASCII字符
re.S, re.DOTALL使.匹配所有字符,包括\n
re.I, re.IGNORECASE忽略大小写
re.M, re.MULTILINE多行匹配
re.X, re.VERBOSE忽略空白,可以使用#添加注释
re.U根据Unicode字符集解析字符, 影响\w, \W, \b, \B

python中的使用方式

一次性使用

# 当一个正则表达式只用一次时, 可以使用这种方式
import re

s = 'Hello world'
# 直接调用re模块中的函数
# 第一个参数是正则表达式
# 第二个参数是要匹配的字符串
# 第三个参数是编译标志, 可选
res = re.match(r'\w+', s, re.I)

预编译方式

# 当需要多次使用同一个正则表达式时, 可以使用预编译方式
import re

s1 = 'hello world'
s2 = 'This is a string.'
# 编译正则表达式, 得到一个模式对象
pattern = re.compile(r'\w+', flags=re.I)
# 调用模式对象的方法匹配指定字符串, 可以重复使用
res1 = pattern.match(s1)
res2 = pattern.match(s2)

具体功能

匹配

import re
# 编译正则表达式, 得到模式对象
p = re.compile(patternString,flags=0)
# 使用模式对象匹配指定字符串,返回match对象或None,从字符串最左端进行匹配
# string是要匹配的字符串, pos是开始位置, endpos是结束位置
m = p.match(string[,pos[,endpos]])

# match对象的方法
# 获取分组值
m.group(n)  # 返回分组n的值
m.group(name)  # 返回名称为name的命名分组的值
m.group(x, y, z)  # 返回x, y, z分组的值的元组
m.groups()  # 返回除了group 0之外的所有分组值的元组
# 获取匹配的范围
m.span()  # 以元组的形式返回匹配的结果在原字符串中的索引位置, (m, n)
m.start()  # 匹配结果在原字符串中开始的位置
m.end()  # 匹配结果在原字符串中结束的位置

搜索

import re
# 编译正则表达式, 得到模式对象
p = re.compile(patternString,flags=0)
# 使用模式对象匹配指定字符串,返回匹配对象或None,从字符串的任意位置开始匹配,返回第一个匹配的匹配对象(match)
# string是要搜索的字符串, pos是开始位置, endpos是结束位置
m = p.search(string[,pos[,endpos]])

查找全部

import re

p = re.compile(patternString,flags=0)
# 返回所有匹配值的列表
p.findall(string[,pos[,endpos]])
# 返回包含所有匹配值的迭代器
p.finditer(string[,pos[,endpos]])

替换

import re

p = re.compile(patternString,flags=0)
# 替换所有匹配值,返回替换后的新字符串
# replacement可以是字符串,也可以是函数
# 当replacement是函数时,每次匹配时将match对象传入函数,函数应返回字符串结果,用来替换匹配值
# count参数用来指定替换次数
p.sub(replacement,string[,count=0])  # 返回替换后的新字符串
p.subn(replacement,string[,count=0])  # 返回新字符串和替换次数的元组

切割

import re

p = re.compile(patternString,flags=0)
# 按照匹配切割字符串,如果表达式包含组,则匹配的组会被列在结果列表中
p.split(string[,maxsplit])  # 返回列表
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值