正则表达式

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 实例

  1. re.match()
import re
info1 = "Hello world,you are beautiful"
info2 = "hello%"
#定义正则表达式
regStart = r"wow"
#从字符串开始位置匹配,是否包含符合正则表达式的内容
print(re.match(regStart,info1))

  1. 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'>
  1. 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']

  1. 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 懒惰模式

正则表达式,会首先搜索匹配正则表达式开始位置的字符,然后逐步向字符串的结束位置查找,一旦找到匹配的就返回,然后接着查找

推荐阅读更多精彩内容

  • python的re模块--细说正则表达式 可能是东半球最详细最全面的re教程,翻译自官方文档,因为官方文档写的是真...
    立而人阅读 10,744评论 3 34
  • Python中的正则表达式(re) import rere.match #从开始位置开始匹配,如果开头没有则无re...
    BigJeffWang阅读 2,915评论 0 98
  • 搞懂Python 正则表达式用法 Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一...
    厦热阅读 310评论 0 2
  • re模块手册 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 1,818评论 0 11
  • (一) 见了好友,经她的指点,一下子弄清楚了,书本上不明白的地方,这个问题困扰了我好几天,而且我上网查阅了好多资料...
    龙眼花开的季节阅读 26评论 0 0