正则表达式

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

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