1. 什么是正则表达式
正则表达式,也称为规则表达式,英文名称Regular Expression,我们在程序中经常会缩写为regex或者regexp,专门用于进行文本检索、匹配、替换等操作的一种技术。
2. Python中的正则表达式
2.1 Python中的正则表达式模块re
Python提供的正则表达式处理模块re,提供了正则表达式的处理函数
2.2 字符串查询匹配的函数
函数 |
描述 |
re.match(reg,info) |
用于在开始位置匹配目标字符串info中符合正则表达式reg的字符,匹配成功会返回一个match对象,匹配不成功返回None |
re.serach(reg,info) |
扫描整个字符串info,使用正则表达式reg进行匹配,匹配成功返回匹配的第一个match对象,匹配不成功返回None |
re.findall(reg,info) |
扫描整个字符串info,经复核正则表达式reg的字符串全部提取出来存放在列表中返回 |
re.fullmatch(reg,info) |
扫描整个字符串,如果整个字符串都包含在正则表达式表示的范围中,返回整个字符串,否则返回None |
re.finditer(reg,info) |
扫描整个字符串,将匹配到的字符包含在一个可以遍历的列表中 |
2.3 字符串拆分替换的函数
函数 |
描述 |
re.split(reg,string) |
使用指定的正则表达式reg匹配的字符,将字符串string拆分成一个字符串列表,如:re.split(r”\s+”,info),表示使用一个或者多个空白字符串info进行拆分,并返回一个拆分后的字符串列表 |
re.sub(reg,repl,string) |
使用指定的字符串repl来替换目标字符串string中匹配正则表达式reg的字符 |
2.4 正则表达式中的元字符
元字符 |
描述 |
^ |
表示匹配字符串的开头位置的字符 |
$ |
表示匹配字符串的结束位置的字符 |
. |
表示匹配任意一个字符 |
\d |
匹配一个数字字符 |
\D |
匹配一个非数字字符 |
\s |
匹配一个空白字符 |
\S |
匹配一个非空白字符 |
\w |
匹配一个数字/字母/下划线中任意一个字符 |
\W |
匹配一个非数字字母下划线的任意一个字符 |
\d |
匹配一个单词的边界 |
\B |
匹配不是单词的开头或者结束位置 |
2.5 实例
- re.match()
import re
info1 = "Hello world,you are beautiful"
info2 = "hello%"
#定义正则表达式
regStart = r"wow"
#从字符串开始位置匹配,是否包含符合正则表达式的内容
print(re.match(regStart,info1))
- re.search
import re
info1 = "Hello world,you are beautiful, you are cute"
info2 = "hello%"
#定义正则表达式
regStart = r"are"
#扫描整个字符串,是否包含符合正则表达式的内容,返回匹配到的第一个字符串的match对象
print(re.search(regStart,info1))
#输出:<_sre.SRE_Match object; span=(16, 19), match='are'>
- re.findall()
import re
info1 = "Hello world,you are beautiful, you are cute"
info2 = "hello%"
#定义正则表达式
regStart = r"are"
#扫描整个字符串,是否包含符合正则表达式的内容,返回匹配到的字符串的迭代对象
print(re.findall(regStart,info1))
#输出:['are', 'are']
- re.fullmatch()
import re
info1 = "Hello world,you are beautiful, you are cute"
info2 = "hello%"
info3 = 'hello'
#定义正则表达式
regStart = r"are"
#扫描整个字符串,是否包含符合正则表达式的内容,返回匹配到的第一个字符串的match对象
print(re.fullmatch(r"\w*",info3))
print(re.fullmatch(r"\w*",info2))
#输出:<_sre.SRE_Match object; span=(0, 5), match='hello'>
None
2.6 正则表达式中的词量
词量 |
描述 |
x* |
用于匹配符号*前面的字符出现0次或者多次 |
x+ |
用于匹配符号+前面的字符出现1次或者多次 |
x? |
用于匹配符号?前面的字符出现0次或者1次 |
x{n} |
用于匹配符号{n}前面的字符出现n次 |
x{m,n} |
用于匹配符号{m,n}前面的字符至少出现m次,最多n次 |
x{n,} |
用于匹配符号{n,}前面的字符至少出现n次 |
2.6.1 实例
import re
info = "look look!,good gooood!"
#匹配一段字符中出现单词o字符0次或多次的情况
print(re.findall(r"o*",info))
#匹配一段字符串中出现单词o字符出现1次或多次的情况
print(re.findall(r"o+",info))
#匹配一段字符串中出现单词o字符出现0或1次的情况
print(re.findall(r"o?",info))
#匹配字符串中连续出现2次字符o的情况
print(re.findall(r"o{2}",info))
#匹配字符串中连续出现2次以上字符o的情况
print(re.findall(r"o{2,}",info))
#匹配字符串中连续出现2次以上3次以内o字符的情况
print(re.findall(r"o{2,3}",info))
#输出:
['', 'oo', '', '', '', 'oo', '', '', '', '', 'oo', '', '', '', 'oooo', '', '', '']
['oo', 'oo', 'oo', 'oooo']
['', 'o', 'o', '', '', '', 'o', 'o', '', '', '', '', 'o', 'o', '', '', '', 'o', 'o', 'o', 'o', '', '', '']
['oo', 'oo', 'oo', 'oo', 'oo']
['oo', 'oo', 'oo', 'oooo']
['oo', 'oo', 'oo', 'ooo']
2.7 正则表达式中的范围匹配
范围 |
描述 |
[0-9] |
用于匹配一个0-9之间的数字,等价于\d |
[^0-9] |
用于匹配一个非数字字符,等价于\D |
[3-6] |
用于匹配一个3-6之间的数字 |
[a-z] |
用于匹配a-z之间的数字 |
[A-Z] |
用于匹配一个A~Z之间的字母 |
[a-zA-Z] |
用于匹配一个a~z或者A-Z之间的字母,匹配任意一个字母 |
[a-zA-Z0-9] |
用于匹配一个字母或者数字 |
[a-zA-Z0-9_] |
用于匹配一个字母或者数字或者下划线,等价于\w |
[^a-zA-Z0-9_] |
用于匹配一个非字母或者数字或者下划线,等价于\W |
2.7.1 实例
import re
info = "Hello World_!.The price is 100!"
#匹配字符串中的数字
print(re.findall(r"[0-9]+",info))
#匹配小写字母
print(re.findall(r"[a-z]+",info))
#匹配大写字母
print(re.findall(r"[A-Z]+",info))
#匹配所有字母
print(re.findall(r"[A-Za-z]+",info))
#匹配小写字母和下划线
print(re.findall(r"[a-z_]+",info))
#输出:
['100']
['ello', 'orld', 'he', 'price', 'is']
['H', 'W', 'T']
['Hello', 'World', 'The', 'price', 'is']
['ello', 'orld_', 'he', 'price', 'is']
2.8 正则表达式中的分组
分组 |
描述 |
(expression) |
使用圆括号直接分组;正则表达式本身匹配的结果就是一个组,可以通过group()或者group(0)获取;正则表达式中包含的圆括号就是按照顺序从1开始编号的小组 |
(?P<name>expression) |
使用圆括号分组,然后给当前的圆括号表示的小组命名为name,可以通过group(name)进行数据的获取 |
2.8.1 实例
import re
phone = input("请输入:")
#进行正则匹配,得到match对象,对象中包含了分组信息
reg = re.search(r"^(\d{3,4})-(\d{4,8})$", phone)
print(reg)
#匹配结果为默认的组,可以通过group()或者group(0)获取
print(reg.group())
#获取结果中第一个括号对应的组数据:处理区号
print(reg.group(1))
#获取第二个括号对应的组数据:处理号码
print(reg.group(2))
#输出:
请输入:010-6612345
<_sre.SRE_Match object; span=(0, 11), match='010-6612345'>
010-6612345
010
6612345
import re
phone = input("请输入:")
# 进行正则匹配,得到Match对象,对象中就包含了命名分组信息
res2 = re.search(r"^(?P<nstart>\d{3,4})-(?P<nend>\d{4,8})$", phone)
# 查看匹配结果
print(res2)
# 匹配结果为默认的组,可以通过group()或者group(0)获取
print(res2.group(0))
# 通过名称获取指定的分组信息:处理区号
print(res2.group("nstart"))
# 通过名称获取指定分组的信息:处理号码
#输出:
请输入:010-6612345
<_sre.SRE_Match object; span=(0, 11), match='010-6612345'>
010-6612345
010
2.9 正则表达式中的特殊用法
表达式 |
描述 |
(?:expression) |
作为正则表达式的一部分,但是匹配结果丢弃 |
(?=expression) |
匹配expression表达式前面的字符,如 "How are you doing" ,正则"(?<txt>.+(?=ing))" 这里取ing前所有的字符,并定义了一个捕获分组名字为 "txt" 而"txt"这个组里的值为"How are you do" |
(?<=expression) |
匹配expression表达式后面的字符,如 "How are you doing" 正则"(?<txt>(?<=How).+)" 这里取"How"之后所有的字符,并定义了一个捕获分组名字为 "txt" 而"txt"这个组里的值为" are you doing"; |
(?!expression) |
匹配字符串后面不是expression表达式字符,如 "123abc" 正则 "\d{3}(?!\d)"匹配3位数字后非数字的结果 |
(?<!expression) |
匹配字符串前面不是expression表达式字符,如 "abc123 " 正则 "(?<![0-9])123" 匹配"123"前面是非数字的结果也可写成"(?!<\d)123" |
2.10 正则表达式的贪婪模式和懒惰模式
2.10.1 贪婪模式
正则表达式匹配的一种模式,速度快,但是匹配的内容会从字符串两头向中间搜索匹配,一旦匹配选中,就不继续向字符串中间搜索了。
2.10.2 懒惰模式
正则表达式,会首先搜索匹配正则表达式开始位置的字符,然后逐步向字符串的结束位置查找,一旦找到匹配的就返回,然后接着查找
网友评论