前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python正则表达式(上)

Python正则表达式(上)

作者头像
小雨coding
发布于 2020-07-22 08:10:47
发布于 2020-07-22 08:10:47
1.6K00
代码可运行
举报
文章被收录于专栏:小雨编程小雨编程
运行总次数:0
代码可运行

本节知识大纲:

一、正则表达式介绍

正则表达式是什么?正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比模具做产品,而正则就是这个模具,定义一种规则去匹配符合规则的字符。

如果我们对字符串有要求,我们就可以通过正则表达式把它表示出来,我们可以用正则表达式去匹配符合规则的字符串;

正则表达式的处理对象是字符串,主要应用正则表达式的操作有:

  • 验证
  • 查找
  • 替换
1. 正则表达式的匹配流程:

图片.png

2. 正则表达式的应用流程

match()是用于校验的函数

案例01:输入一个三位数,通过正则表达式输入的是否满足要求?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
input_number = input("请输入一个三位数:")
match = re.match("^\d{3}$",input_number)
if match is None:
    print("不符合要求")
else:
    print("符合要求")

案例02

判断输入的手机号码是否有效,要求:号码位数是11位;第一位是数字1;第二位是数字345789;后面是0-9均可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 步骤一:通过引擎编译出对象
import re
pattern = re.compile(R"[1][345789]\d{9}")   # 编译出pattern对象
input_mobile = input("请输入手机号码:")
# 步骤二:对输入的内容进行匹配
# print(pattern.match(input_mobile))
if pattern.match(input_mobile):
    print("输入的手机号有效!")
else:
    print("输入的手机号无效!")
3.正则表达式的基本语法

图片.png

二、预定义字符

如果每次都通过代码来验证正则表达式是否正确效率有点低,我们可以通过在线工具来校验我们的正则表达式是否正确,比如oschina的在线正则表达式测试工具;当然在Windows系统下可以使用RegexBuddy工具进行检测。

普通字符:字母、数字、下划线以及没有特殊意义的符号,都是普通字符。

元字符:这里主要有11个构成正则表达式元字符

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.   \   |   ^   $   *   +   ?   []   {}   ()
1. 通配字符

.是一个能匹配除\n以外任何字符的通用匹配符,例如,我们想匹配以a开头的,后面跟3个任意字符的正则表达式可以这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
re.match("^a...","avfs")

另外三个连续的通配符可以写成{3}像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
re.match("^a.{3}","avfs")

这里也可以使用findall()方法,能返回待匹配字符串中所有与正则表达式相匹配的字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(re.findall("a.{3}","avfssssadddadddaef"))  # 把匹配开头的^去掉了

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['avfs', 'addd', 'addd']
2. 反斜杠

反斜杠加字母有时候在转义字符和正则表达式中功能冲突,通常的解决办法是使用r或者R取消转义。

三、字符集

1. 系统正则表达式字符集

案例:

非数字开头 + 两个空格 + 数字/字母/下划线

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
print(re.match(R"^\D\s{2}\w$","a  _"))
2. 用户自定义正则表达式字符集

除了使用系统字符集以外,用户可以自定义字符集

注意:这里一个中括号只能匹配一个字符;^在中括号外表示一行开始,在中括号里面表示取反、排除的意思

案例:

使用自定义字符集,匹配不区分大小写以a-f开头,接接着是三个小写字母,再后面是以偶数结尾

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
print(re.findall(R"[a-fA-F][a-z]{3}[02468]","bddf42fbas8"))

注意:除了^-以外,如果把其它任何特殊符号放到[]里,那么就自动去掉特殊意义,只表示符号本身的含义,如.[]里只表示.点号的意思,没有了通配符的功能。

四、正则表达式中量词

1. 三种量词符号

案例:通过正则表达式匹配英文单词,要求以na开头,以e来结尾

方法一:使用*

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(re.findall(R"na[a-z]*e","my name is Alice,nae,nattore"))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['name', 'nae', 'nattore']

使用*号匹配name(重复1次),匹配nae(重复0次),匹配nattore(重复多次)

方法二:使用+

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(re.findall(R"na[a-z]+e","my name is Alice,nae,nattore"))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['name', 'nattore']

使用+号,只能匹配name(重复1次),匹配nattore(重复多次)

方法三:使用?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(re.findall(R"na[a-z]?e","my name is Alice,nae,nattore"))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['name', 'nae']

使用?号,只能name(重复1次)和nae(重复0次)

案例:

判断身份证号是否有效, 特征一:长度18或者15位 特征二:前17位是数字 特征三:最后一位是数字或者x

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(re.match(r"(\d{14}[0-9x]|\d{17}[0-9x])","34262320001218646x"))
2. 花括号表示重复次数

(1){n}表示重复n次

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 正则表达式匹配以na开头加上4个小写字母并以e结尾:
print(re.findall(R"na[a-z]{4}e","my name is Alice,nae,nattore"))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['nattore']

(2){n,m}表示重复n到m次

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 正则表达式匹配以na开头加上3-10个小写字母并以e结尾:
print(re.findall(R"na[a-z]{3,10}e","my name is Alice,naicajoe,nattorirce"))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['naicajoe', 'nattorirce']

(3){n,}表示重复n次到无限次

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 正则表达式匹配以na开头加上3个以上的小写字母并以e为结尾:
print(re.findall(R"na[a-z]{3,}e","my name is Alice,naicajoe,nattorighjrce"))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['naicajoe', 'nattorighjrce']
3. 贪婪模式和非贪婪模式

(1)贪婪模式 贪婪模式是指在Python在默认情况下量词会尽可能多的匹配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(re.findall("\d+","12345678888888abc"))    # 尽量多的匹配
print(re.findall("\d*","12345678888888abc"))
print(re.findall("\d{3,}","12345678888888abc"))
print(re.findall("\d{3,8}","1234567888888888abc"))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['12345678888888']
['12345678888888', '', '', '', '']
['12345678888888']
['12345678', '88888888']

(2)非贪婪模式 在表达式的结尾加上问号?,会切换成非贪婪模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(re.findall("\d+?","12345678888888abc"))
print(re.findall("\d{3,}?","12345678888888abc"))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['1', '2', '3', '4', '5', '6', '7', '8', '8', '8', '8', '8', '8', '8']
['123', '456', '788', '888']

五、字符边界

Python正则表达式字符边界主要有四种:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
^      开始位置
$      结束
\b     单词边界
\B     非单词边界
1. 字符串的开始和结束

案例:

输入一个6位数字,必须要以95开头,以8结尾的数字

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(re.findall(r"^95\d{3}8$","958348"))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['958348']
2. 字符串的边界

\b表示单词的边界,指某一个位置前后不都是字母、数字、下划线(\w) 案例:输入一句英文,找出里面以a、b、c开头的单词

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str01 = "Use this toggle to the left to manage how your " \
        "browser uses BBC’s performance cookies. If you’re " \
        "outside the UK you can also use the toggle to set " \
        "your preferences for personalised advertising cookies."
pattern = re.compile(r"\b[abcABC][a-z]*\b")
print(pattern.findall(str01))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['browser', 'cookies', 'can', 'also', 'advertising', 'cookies']

六、逻辑判断

正则表达式中表示逻辑或的是用符号|,分为整体或和部分或

(1)整体或 案例:简单匹配身份证号,现在的身份证号是18位以前是15位,我们希望两者都兼容;前面全是数字,最后一位可以是数字或者x

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
print(re.findall("\d{14}[0-9x]|\d{17}[0-9x]]","34262219971012x"))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['34262219971012x']

(2)部分或 案例:在一段英文句子中,找出es、er或者ing结尾的单词

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str01 = "Use this toggle to the left to manage how your " \
        "browser uses BBC’s performance cookies. If you’re " \
        "outside the UK you can also use the toggle to set " \
        "your preferences for personalised advertising cookies."
pattern = re.compile(r"\b[a-z]*(es|ing|er)\b")
print(pattern.findall(str01))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['er', 'es', 'es', 'es', 'ing', 'es']

为什么没有显示出完整的单词呢,这就涉及到正则表达式中分组的知识了;

七、 分组

1. 捕获组与非捕获组

分组是我们正则表达式中一个难点,把正则表达式的一部分用括号括起来作为一个组;主要包括捕获组()非捕获组(?:)如何进行捕获呢?待捕获的表达式用小括号括起来,编号从1开始,后面通过反斜杠加数字标号进行调用。我们以一个案例来进行解释

案例: 在前一段英文中,匹配这样的单词,有5个字符;第一个字母和第五个一样,第二个和第四个一样,比如abcba

分析:因为匹配的是单词第一个和最后一个都是单词的边界,故正则表达式的前后都用\b,第一个字母和第二个字母后面都要用到所以分别给它们设置捕获组。用小括号括起来([a-z])([a-z])第三字母后面用不到所以不设置捕获组,第四个字母和第五个字母调用前面的捕获组,所以通过反斜杠加数字编号来进行调用,所以主要的正则表达式为:\b([a-z])([a-z])[a-z]\2\1\b

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
print(re.findall(r"\b([a-z])([a-z])[a-z]\2\1\b","fdadd abcba"))

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[('a', 'b')]

貌似是匹配到了,但是输出的结果并不满意,并不是完整的显示内容这是怎么回事呢?

原因:如果对正则表达式做了分组,使用findall函数则显示捕获组所匹配的内容,不能完整显示,如果想完整显示的话有两个解决办法:

方法一:使用非捕获组 如果不需要对捕获组的内容调用,可以使用非捕获组,在表达式前加上?:就可以了,表示只捕获数据了,只用来表达条件。

回到我们前面的案例,英文句子中匹配单词,怎样才能完整显示呢?对于后面不需要调用的正则表达式分组,我们使用非捕获组的方式,就是表达式前加上问号和冒号即可,则前面的正则表达式\b[a-z]*(es|ing|er)\b可以写成\b[a-z]*(?:es|ing|er)\b,这样我们的输出结果就是完整的单词了。

方法二:使用迭代函数finditer 将findall函数改为迭代函数finditer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
match_result = re.finditer(r"\b([a-z])([a-z])[a-z]\2\1\b","fdadd abcba")
match_list = []
for i in match_result:
    match_list.append(i.group(0))
print(match_list)

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['abcba']

这样就能完成显示匹配结果了

2. 分组的命名

捕获组默认是从数字1开始编号的,但是如果捕获组数量多的话,最好还是能给捕获组命名方便调用,那么怎么给捕获组命名呢?

命名的方法:加问号加P跟着尖括号里写上名称(?P<名称>)

调用的方法:加问号加P等于号号码跟上名称(?P=name)前面的正则表达式\b([a-z])([a-z])[a-z]\2\1\b命名可以写成\b(?P<number01>[a-z])(?P<number02>[a-z])[a-z](?P=number02)(?P=number01)\b

实际代码可以写成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(re.findall(r"\b(?P<number01>[a-z])(?P<number02>[a-z])[a-z](?P=number02)(?P=number01)\b","fdadd abcba"))

八、零宽断言

Python正则表达式的零宽断言有着不同的称呼:零宽度断言、预搜索、环视等等,它是干嘛的呢?它是用来匹配一个位置 零宽的意思是不占用字符宽度、位置,比如\b表示单词起始或者结束的位置,^表示正则表达式的开始;$表示正则表达式的结束;零宽断言的特征:

(1)做位置的匹配,不占宽度

(2)匹配的内容不计入最终的结果

(3)主要用作判断某个位置的前后字符

1. 语法格式

图片.png

2. 解释

有一段字符串我们根据它前面的表达式来找到匹配的字符串,比如要在www.baidu.com中查找名称baidu,我们可以根据条件声明根域名是以www.开头的,.com结尾的。那么零宽断言的表达式就可以写成(?<=www[.])[a-z]+(?=[.]com)代码示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
print(re.findall(r"(?<=www[.])[a-z]+(?=[.]com)","www.baidu.com"))

输出结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['baidu']

注意:匹配输出的内容是零宽断言括号外面的部分

正则表达式是一个非常强大的工具,熟练地使用正则表达式能加大地提高我们代码的效率,它的的内容很丰富我们一节没有讲完,下一节我们继续讲解正则表达式的知识~

·END·

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小雨编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python正则表达式(下)
(1)match()从string首字母开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None;一般用于:完全匹配,用于严格的校验
小雨coding
2020/07/27
1.4K0
Python的正则表达式_python正则表达式例子
https://github.com/ziishaned/learn-regex/ https://regex101.com/ 在线练习
全栈程序员站长
2022/09/30
6430
正则表达式学习笔记
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。 在各大编程语言中都能发挥出很大的作用。每种语言也都有关于正则表达式模块的实现。 本文以Python举例说明。
earthchen
2020/09/24
5840
Python3 正则表达式特殊符号及用法.md
正则表达式(Regular expressions 也称为 REs,或 regexes 或 regex patterns)本质上是一个微小的且高度专业化的编程语言。 它被嵌入到 Python 中并通过 re 模块提供给程序猿使用;而且Python 的正则表达式引擎是用 C 语言写的,所以效率是极高的。
全栈工程师修炼指南
2020/10/23
2.7K0
python3--re模块:正则表达式
根据手机号码一共11位并且只以13,14,15,18开头的数字这些特点,写了一段代码如下:
py3study
2018/08/02
8450
re模块和正则表达式
re模块 讲正题之前我们先来看一个例子:https://reg.jd.com/reg/person?ReturnUrl=https%3A//www.jd.com/ 这是京东的注册页面,打开页面我们就看
用户1214487
2018/01/23
7470
Python正则表达式
正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能不一样,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的。下面,我来介绍一下python中的正则表达式是怎么使用的
王大力测试进阶之路
2019/10/25
9600
Python正则表达式
正则表达式
一、在python中, 使用正则表达式, 需要导入re模块 import re 二、普通字符匹配, 使用findall 1 #字符匹配, 普通字符 2 #findall: 返回所有满足条件的列表集合
用户7798898
2022/05/06
2670
【Python正则表达式】:文本解析与模式匹配
正则表达式写出来后需要使用,那么需要使用re模块进行使用,提取及验证等操作,re模块为内置模块,使用时需要导包 ----- import re
爱喝兽奶的熊孩子
2024/08/06
2350
【Python正则表达式】:文本解析与模式匹配
正则表达式Python_js正则表达式实例
正则表达式 英文名称叫 Regular Expression简称RegEx,是用来匹配字符的一种工具,它常被用在网页爬虫,文稿整理,数据筛选等方面,最常用的就是用在网页爬虫,数据抓取。
全栈程序员站长
2022/11/09
7.2K0
正则表达式Python_js正则表达式实例
Python 08 re 正则表达式
[0-9]代表的含意与\d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于\w
py3study
2020/01/08
7720
python re 正则表达式学习总结
# -*- coding: utf-8 -*- import re import os #------------------------------------- re(正则表达式)模块 -------------------------------- #----------------------------------------------------------------------------------------------------- #-----------------------
py3study
2020/01/13
1K0
Python3 正则表达式
        正则表达式是用来匹配字符串的强有力武器,它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
嵌入式视觉
2022/09/05
4920
Python3 正则表达式
从基础到最佳实践:精通Python正则表达式
Python re模块精通:解锁Regex文本处理能力!从数据提取、用户验证到自动化任务,掌握字符类、量词、锚点等核心概念。更有re.search()、re.sub()等函数,结合IGNORECASE等修饰符,提升数据处理效率,玩转Cloud Native!
云云众生s
2025/03/20
1730
深入理解Python正则表达式:解析、匹配和高级技巧
正则表达式是一种强大的文本处理工具,它允许你在文本中搜索、匹配和处理模式。Python中的re模块提供了对正则表达式的支持,本文将深入探讨Python正则表达式的工作原理、基本用法、高级技巧以及实际应用,帮助你更好地掌握这一强大的工具。
海拥
2023/09/19
2.6K0
深入理解Python正则表达式:解析、匹配和高级技巧
笔记·正则表达式和re库
提示:本页面转载内容过多,所使用的参考资料全部放在最后一章中 本页面的内容不会获得任何收益,同样本页面的内容也不会发送到任何第三方平台中,White_mu收集此页面的内容仅仅是便于自己学习,如果这触碰了您的利益,请您联系我们:WhitemuTeam@outlook.com
Moemu
2023/05/04
1.1K0
【Python】正则表达式的艺术:轻松驾驭 Python 的re库
本文将会先介绍什么是正则表达式,然后在介绍正则表达式在python中的应用。 下方图片及案例思路来自:正则表达式
Yui_
2024/12/20
1710
【Python】正则表达式的艺术:轻松驾驭 Python 的re库
re模块(正则表达式)
一、什么是正则表达式 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。 二、正则表达式基础 字符组 : [字符组] 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 字符分为很多类,比如数字、字母、标点等等。 1 [1] 匹
人生不如戏
2018/04/10
7710
python基础——正则表达式
正则表达式(Regular Expression)是一种用于处理字符串的强大工具,它可以用来检查字符串是否符合某种模式、提取字符串中的特定部分或者替换字符串中的某些内容。 比如在某些场景,我们在输入邮箱的时候,如果我们的输入不符合邮箱地址的规则,则会被提示错误输入。
用户11029137
2024/05/03
1270
python基础——正则表达式
re模块和正则表达式[通俗易懂]
  在如今这个网络横行的时代,网络对我们的生活起着举足轻重的作用,在我们日常生活中是随处可见的:坐车买票,日常生活物品的购买,医院就医。。。。在我们网上购物的时候会进入登陆界面进行一系列的基本信息的验证例如:用户名,电话号码等。如果输入的格式不正确就会提示你输入信息错误重新输入,那么计算机怎么就知道你所输入的是错误的呢?
全栈程序员站长
2022/07/21
2800
相关推荐
Python正则表达式(下)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验