本文为CSDN博主「妖x月」的原创文章,原文链接:https://blog.csdn.net/qq_42349627/article/details/100072601
正则表达式在线测试工具:
http://c.runoob.com/front-end/854
https://regexr.com/
https://tool.oschina.net/regex/
正则表达式详细教程:
https://www.runoob.com/regexp/regexp-tutorial.html
什么是正则表达式
正则表达式,又称为规则表达式,通常被用来检索、替换那些符合某个模式规则的文本。
正则表达式是对字符串操作的一种逻辑公示,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个规则字符串用来表达最字符串的一种过滤逻辑。
为什么要学习正则表达式
学习正则表达式实际上就是大家常说的爬虫常用的一种方式,
比如我们下载了一个网页的全部数据,或者一个APP的源代码,但这些数据很庞大并且很混乱,大部分数据是不需要的,这就需要我们过滤筛选,匹配出想要的部分。那么对于文本的过滤或者规则的匹配,最强大的就是正则表达式,也是Python爬虫世界里必不可少的神兵利器。
爬虫的主要步骤分为四步:
1.明确目标(选择需要的网站或其他想要的);
2.爬(将网站的所有内容全部爬下来);
3.去(去掉无用的数据);
4.处理数据(按照我们想要的方式存储和使用)。
校验字符的表达式
1. 汉字:^[\u4e00-\u9fa5]{0,}$
|2. 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
3. 长度为3-20的所有字符:^.{3,20}$
4. 由26个英文字母组成的字符串:^[A-Za-z]+$
5. 由26个大写英文字母组成的字符串:^[A-Z]+$
6. 由26个小写英文字母组成的字符串:^[a-z]+$
7. 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
8. 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
9. 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
10. 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
11. 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+ 12 禁止输入含有~的字符:[^~\x22]+
Re模块
正则表达式使用对特殊字符进行转义,所以如果我们要使用原始字符串,只需加一个 r 前缀,e.g. r'lrachel\t.\tpython'
re 模块一般使用步骤
1). 使用 compile() 函数将正则表达式的字符串形式编译为一个 Pattern 对象
2). 通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果,一个 Match 对象。
3). 最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作
compile 函数
compile函数用于编译正则表达式,生成一个Pattern 对象,它的一般使用形式如下:
import re
#将正则表达式编译成Pattern 对象
pattern = re.compile(r'\d+')
Pattern 对象
正则表达式编译成 Pattern 对象, 可以利用 pattern 的一系列方法对文本进行匹配查找了。
Pattern 对象的一些常用方法主要有:
1. match 方法:从起始位置开始查找,一次匹配
2. search 方法:从任何位置开始查找,一次匹配
3. findall 方法:全部匹配,返回列表
4. finditer 方法:全部匹配,返回迭代器
5. split 方法:分割字符串,返回列表
6. sub 方法:替换
match 方法
1.match 方法用于查找字符串的头部(也可以指定起始位置),它是一次匹配,只要找到了一个匹配的结果就
2. 返回, 而不是查找所有匹配的结果。它的一般使用形式: mach(string[,pos[,endpos]])。
string 待匹配的字符串;pos 字符串的起始位置, 默认值是 0;endpos 字符串的终点位置, 默认值是 len (字符串长度)。
Match 对象
1.group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);
2.start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认 值为 0;
3.end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数 默认值为 0;
4.span([group]) 方法返回 (start(group), end(group))。
search 方法
search 方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有 匹配的结果,它的一般使用形式如下:
当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。
findall 方法与finditer 方法
findall方法搜索整个字符串,获得所有匹配的结果。使用形式如下:
findall(string[,pos[,endpos]])
finditer方法的行为跟findall的行为类似,也是搜索整个字符串,获得所有匹配的结果。但它返回一个顺序访问每一个匹配结果(Match对象)的迭代器。
split 方法
split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:
split(string[,maxsplit])
maxsplit 指定最大分割次数,不指定将全部分割.
sub方法
sub 方法用于替换。它的使用形式如下:
sub(rep1,string[,count])
import re
p = re.compile(r'(\w+) (\w+)') # \w = [A-Za-z0-9]
s = "hello 123,hello 456"
print p.sub(r'hello world',s) #使用‘hello world’ 替换‘hello 123’ 和 ‘hello 456’
print p.sub(r'\2 \1', s) #引用分组
def func(m):
return 'hi' + ' ' + m,group(2)
print p.sub(func,s)
print p.sub(func,s,1) #最多替换一次
repl 可以是字符串也可以是一个函数:
1). 是字符串,使用 repl 去替换字符串每一个匹配的子串,并返回替换后的字符串,
2). 如果 repl 是函数,这个方法应当只接受一个参数(Match 对象),并返回一个字符串用于替换.
count 用于指定最多替换次数,不指定时全部替换。
匹配中文
在某些情况下,我们相匹配文本中的汉字,有一点需要注意的是,中文的unicode编码范围,主要在[u4e00-u9fa5],这里主要是因为这个范围不完整,比如没有包括全部中文标点,不过在大部分情况下,应该是够用的。
贪婪模式与非贪婪模式:abbbc
范例
常见格式
# 导入正则表达式对应的模块;
import re # 定义正则表达式的规则;
pattern = r'westos' # 对正则表达式进行一个编译, 编译后, 匹配速度更快;
patternObj = re.compile(pattern) # 将来要处理的字符串内容;
text = "hello westos hello world westos" # 匹配符合正则规则的所有内容;
result = patternObj.findall(text)
print(result)