本节梗概
- 学习使用正则表达式的构建规则
文章目录
一、 介绍
正则表达式,也称规则表达式,在计算机科学技术中,正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。我们已经能够获得目的网页对应的源代码的字符串形式,因此我们可以基于正则字符串匹配来定位获取目标信息,这也是实现简单爬虫的一种方法。接下来我们简单对正则表达式的构建进行学习认识。
☆[正则表达式测试网站:https://tool.oschina.net/regex/]
二、 正则构建规则
注:为了演示各个字符的使用规则,进行验证时,将使用re模块中的compile函数:其会将其传入的正则匹配式子转换为re.Pattern类型作为模板,调用其.findall方法即可返回一个元素为字符串的列表,其中的每个元素都是字符串,且都匹配re.Pattern模板
2.1 原义字符
在正则表达式中指定原义单个字符,一般构建的正则匹配表达式中需要原义字符和元字符共同使用,有些元字符就依赖于原义字符
import re
# 原义字符的测试
test_txt = '天空是蓝色的,大地是绿色的,花朵是粉色的'
# 构建re.Pattern对象
pattern = re.compile("是")
# 检索符合的子字符串
pattern.findall(test_txt)
2.2 元字符 —— 句号.
在正则表达式中句号能够匹配任何单字符,但是不包括换行符
import re
# 元字符.的测试
test_txt = '''
天空是蓝色的,大地是绿
色的,花朵是粉色的
'''
# 构建re.Pattern对象
pattern = re.compile(".色")
# 检索符合的子字符串
pattern.findall(test_txt)
2.3 元字符 —— 星号*
星号表示匹配其前一个字符任意次即0-n次(包括零次),匹配连续的多个字符
import re
# 元字符*的测试1
test_txt = '天空是蓝蓝蓝蓝色的,大地是绿绿绿绿绿色的,花朵是粉粉粉色的'
# 构建re.Pattern对象:寻找如下目标:色(蓝出现0次)、蓝色(蓝出现1次),蓝蓝色(蓝出现2次).....
pattern = re.compile("蓝*色")
# 检索符合的子字符串
pattern.findall(test_txt)
import re
# 元字符*的测试2
test_txt = '天空是蓝蓝蓝蓝色的,大地是绿绿绿绿绿色的,花朵是粉粉粉色的'
# 构建re.Pattern对象:匹配所有XXX色,比较一下与上个的差别
pattern = re.compile(".*色")
# 检索符合的子字符串
pattern.findall(test_txt)
2.4 元字符 —— 加号+
加号表示匹配其前一个字符任意次,即1-n次(不包括零次),匹配连续的多个字符,与*号作用相似,唯一差别就是不包括零次
import re
# 元字符+的测试
test_txt = '天空是蓝蓝蓝蓝色的,大地是绿绿绿绿绿色的,花朵是粉粉粉色的'
# 构建re.Pattern对象:寻找如下目标:蓝色(蓝出现1次),蓝蓝色(蓝出现2次).....
pattern = re.compile("蓝+色")
# 检索符合的子字符串,可与‘*号测试1’对比
pattern.findall(test_txt)
2.5 元字符 —— 问号?
问号符号具有多个用法,常用有"重复次数"与“模式切换”
i:重复次数:?号表示其前一个字符匹配0或1次,匹配连续的多个字符,与*乘号、+加号作用类似
ii:切换模式:切换贪婪模式与非贪婪模式(?),贪婪模式下尽可能匹配最多的字符,非贪婪模式下尽可能匹配最少的字符
import re
# 元字符?用法一: 重复次数
text_txt ="紫色的是花朵,浅青色的是叶子,褐色的是土地,都很漂亮"
pattern = re.compile("浅?.色")
pattern.findall(text_txt)
import re
# 元字符?用法二:切换为非贪婪模式,以*举例
text_txt ="紫色的是花朵啊,青色的是叶子啊,褐色的是土地啊,都很漂亮"
# 贪婪模式,不使用?
# 对于.*此时到“啊”截止,贪婪模式下,.*匹配到最后一个“啊”,即此时.*为“的是花朵啊,青色的是叶子啊,褐色的是土地”
pattern1 = re.compile(".色.*啊")
print("贪婪模式:\n",pattern1.findall(text_txt), len(pattern1.findall(text_txt)), sep='\t')
# 贪婪模式,使用?符号,非贪婪模式下,.*匹配到第一“啊”,即此时.*为“的是花朵”
pattern2 = re.compile(".色.*?啊")
print("非贪婪模式:\n",pattern2.findall(text_txt),len(pattern2.findall(text_txt)), sep='\t')
2.6 元字符 —— 乘方符号^
乘方符号具有多个用法,常用的是“取反”和“起始标头”的作用
i:取反用法,一般与中括号[]联合使用,中括号匹配某个范围内的单个字符,两者结合表示匹配非括号中的字符
ii:起始标头:表示只能匹配到处于文本开头的匹配子字符串
import re
# 元字符^用法一: 取反(可与中括号结合使用)
# 此处的中括号代表选择代表其中一个单字符
text_txt ="紫色的是花朵,青色的是叶子,褐色的是土地"
# 不加^
pattern1 = re.compile("[紫青]色的")
# 加^,对中括号的单字符取反操作
pattern2 = re.compile("[^褐]色的")
pattern1.findall(text_txt), pattern2.findall(text_txt)
import re
# 元字符^用法二: 只匹配行头
text_txt ="紫色的是花朵,青色的是叶子,褐色的是土地"
# ".色" 匹配 “紫色”、“青色”、“褐色”
pattern1 = re.compile(".色")
# 加^,附加必须在开头位置的条件
pattern2 = re.compile("^.色")
pattern1.findall(text_txt), pattern2.findall(text_txt)
2.7 元字符 —— 美元符号$
dollar符号的用法与乘方符号的第二种用法刚好相反,即作为“结尾标志”,只检索到文本末尾匹配的字符串
import re
# 元字符$的用法
text_txt = "天空是蓝色的,大地是绿色的, 花朵是粉色的"
pattern = re.compile(".色的$")
pattern.findall(text_txt)
2.8 括号 —— 大括号{}
大括号可以指定其前的单字符重复的次数,或者是范围;指定范围时是左闭右闭;(是*字符的具体版,*字符不能指定重复次数或者范围)
import re
# 大括号{}的用法
text_txt = "天空是是是是是蓝色,大地是是绿色,花朵是粉色"
pattern = re.compile("是{2,4}.色")
# 注:虽然蓝色一共有五个是,但是其丢弃开头一部分能够匹配成功,
# 所以匹配范围时注意高重复会截取后匹配成功
pattern.findall(text_txt)
2.9 括号 —— 中括号[]
中括号可以指定一些特定的单字符,不需要分隔符,不需要加引号,支持使用"-"表示范围;(是元字符.的具体版,.字符匹配除换行外所有字符,但不能特指)
import re
# 中括号[]的用法
text_txt1 ="紫色的是花朵,青色的是叶子,褐色的是土地"
# 指定范围区域
pattern1 = re.compile("[紫青]色的")
text_txt2 = '12月21日是特别的一天'
# 特定范围区域
pattern2 = re.compile("[0-8]")
# 注:只是匹配单个字符,类似的还有[a-z]、[A-Z]等
pattern1.findall(text_txt1), pattern2.findall(text_txt2)
2.10 括号 —— 小括号()
小括号用来指明定位到的子字符串中想要的部分,其作用在爬虫中比较常用:用其他符号定位,再用多个小括号来截取目标内容分组;小括号可以设置多个,添加小括号后返回的为[(“v1”,“v2”, …), (“v1”,“v2”, …), …]
☆小括号分的组可以被起别名,起别名方法在小括号中添加?P<name>
import re
# 中括号[]的用法
text_txt ="紫色的是花朵,青色的是叶子,褐色的是土地,都很漂亮"
# 不用小括号
pattern1 = re.compile(".色的是.{2}")
# 使用小括号,指明目的区域
pattern2 = re.compile("(.色)的是(.{2})")
print("不使用小括号:",pattern1.findall(text_txt),sep='\n')
print("使用小括号:",pattern2.findall(text_txt),sep='\n')
# 为组别起别名 ?P<name>,不影响检索结果
pattern3 = re.compile("(?P<color>.色)的是(.{2})")
print("使用小括号并起别名:",pattern3.findall(text_txt),sep='\n')
# 其他匹配
# pattern3 = re.compile("(.*?色)的是(.*?),")
# pattern3.findall(text_txt)
# pattern4 = re.compile("(.*?色)的是([^“,”]*),")
# pattern4.findall(text_txt)
2.11 特殊符号 —— 转义符号\
转义符号用于取消符号特定作用,等同于文本出现字符,字符串前加r表示取消字符串内转义
import re
text_txt = '紫色?的是花朵,青色.的是叶子,褐色\\的是土地。'
pattern = re.compile(r".色[\?\.\\\\]")
pattern.findall(text_txt)
2.12 特殊字符集
字符 | 范围 |
---|---|
\s | 空白字符:空格、制表符、换行符 |
\S | 非空白符:除去空白字符的所有字符 |
\w | 文本字符:大小写字母、数字、下划线、汉字 |
\W | 非文本字符:除去文本字符的所有字符 |
\d | 数字字符:匹配所有数字字符,等同于[0-9] |
\D | 非数字字符:除去数字字符外所有字符 |
import re
# 特殊字符集的用法
text_txt = '_Birthday_: 5月27日'
pattern1 = re.compile("\s")
pattern2 = re.compile("\S")
pattern3 = re.compile("\w")
pattern4 = re.compile("\W")
pattern5 = re.compile("\d")
pattern6 = re.compile("\D")
print("\s",pattern1.findall(text_txt),"\n\S",pattern2.findall(text_txt))
print("\w",pattern3.findall(text_txt),"\n\W",pattern4.findall(text_txt))
print("\d",pattern5.findall(text_txt),"\n\D",pattern6.findall(text_txt))
三、正则总结
四、结尾
在此已经对正则表达式的简单构建有了一定的认识,只是为了了解正则技术的可以去上面提到的正则测试网站进行构建正则表达式的测试。在下一篇会介绍python中如何使用re库,对正则技术进行应用。
文章和代码都为原创,在记录分享此篇文章查阅了很多资料,也对文章内容和代码进行很多次修改,作者水平有限,难免出现一些错误或者问题,因此内容仅供参考,也欢迎大家提出问题共同讨论,共同进步。