正则表达式快速入门三: python re module + regex 匹配示例
使用 Python 实现不同的正则匹配(从literal character到 其他常见用例)
reference python regular expression tutorial
目录
- importing re
- literal characters(basic/ordinary characters)
- wild/special characters
- repetitions
- groups and named groups
- greedy vs. non-greedy matching
PS : 这个教程涵盖了正则表达式中的一些基本概念,展示了部分re中函数接口的使用, 如 compile() search() findall() sub() split() 等
正则表达式有不同的实现方式(regex flavors): python的 regex engine也只是其中的一种(very modern and complete), 因此可能存在部分正则表达式的mode或者feature python并不支持
import re
import re
Ordinary character(Literal character)
字对字的匹配
除了正则表达式中的特殊字符(metacharacter),大多数字符都会与其自身匹配; 而对于特殊字符如果想要将其按照原义匹配,需要使用反斜杠进行转义
pattern = r"regex"
sequence = "regex"
if re.search(pattern, sequence):
print("Match!")
else: print("Not a Match!")
Match!
pattern = r"\\"
sequence = "\\abc"
if re.search(pattern, sequence):
print("Match!")
else: print("Not a Match!")
Match!
Wild Card Characters: special characters
正则表达式中的特殊字符的用法
# .(dot)
# wildcard (dot match everything)
# search 和group 的用法在之前说过
re.search(r're.ex', 'regex').group()
'regex'
# ^(caret)
# anchor 的一种,指定匹配的位置(at the start of the string)
# 如果你想要确认一段文本或者一个句子是否以某些字符打头,那么^ 是有用的
print(re.search(r"^regex", "regex is powerful").group())
# 而下面这行代码就会报错 :NoneType' object has no attribute 'group'
# print(re.search("^regex", "Let's learn the regex").group())
regex
# $ (dollor character)
# 也是另一种anchor 从末尾开始匹配
# 如果你想确定文本是否以某些character 结尾, 那么$是有用的
print(re.search(r"regex$", "Let's learn the regex").group())
# 而下面这行代码就会报错 :NoneType' object has no attribute 'group'
# print(re.search("regex$", "regex is powerful").group())
regex
# [](character class): 字符集
# [^]: characters that are not within a class : 取非
print(re.search(r"regex: [A-Za-z0-9]", "regex: a").group())
print(re.search(r"regex: [A-Za-z0-9]", "regex: A").group())
print(re.search(r"regex: [A-Za-z0-9]", "regex: 0").group())
print(re.search(r'regex: [^A-Za-z0-9]', "regex: @").group())
regex: a
regex: A
regex: 0
regex: @
# \ Backslash
# 1. 反斜杠可以用在所有特殊字符之前以去掉其特殊含义
# 2. 如果在反斜杠后的字符是一个合法的转义字符,那么他们组成一个具有特殊含义的term 如\d 表示数字字符;如果非法,那么反斜杠将被看做一个普通字符
# 情况一
print(re.search(r"\\d", "\d regexex").group())
# 情况二
print(re.search(r"\d", "2 regexex").group())
\d
2
# 一些以 反斜杠打头的 special sequence
# \w \d \s
# 1. \w:匹配任意的单个字母,数字,或者下划线 \W 匹配无法被 \w匹配的任意字符
# 注:可以通过修改 match flag 来改变\w的范围
print("小写w:", re.search(r"re\we\w", "regex").group())
print("大写W:", re.search(r"re\We\W", "re&e@").group())
小写w: regex
大写W: re&e@
# 也可以尝试其他不同的特殊字符
# \s 表示一个单独的空格 character: 包括 space ,newline, tab ,return
# \S 对 \s 代表的 character class 取非
# \d 表示 数字 0-9
# \D 对 \d 取非
# 对应的大写为取非,接下来仅介绍小写
# \t :tab
# \n :newline
# \r : return
# 还有一些常用的anchor
# \A: 只在字符串的开头进行匹配,跨多行工作(Works across multiple lines as well.)
# \Z: 只在字符串的末尾进行匹配
# 上述和前面介绍的 ^ $ 在功能上是相同的, 区别在于 他们如何处理 MULTLLINE mode
# \b :只在字符串的开头或者结尾进行匹配
Repetition
前面都是字符层次的匹配,为了拓展匹配的范围,接下来展示 正则表达式中的重复
在前面所述的 \d 这一类字符后 使用 + 或者* 可以匹配一长串数字,网址等。两者的功能: check 是否前一个字符出现了0次或者多次(即是否存在重复)
?:检查前一个字符是否出现过;也即问号前的字符 在 目标字符串中可不存在
{}用于指定重复的次数
{x}: 重复 x 次
{x, }: 至少重复x次
{x, y}: 重复至少x 次 ,至多 y 次
re.search(r"\d{3}", "999").group()
'999'
re.search(r"\d{2,4}", "9999").group()
'9999'
grouping in regex
capturing group 是正则表达式的特性之一, 表达式中由一对圆括号括起来的部分被称为group}
group 不会改变匹配的结果,但它将会将匹配的一部分字符串组成一个 capturing group 对象,可以使用index进行索引,也可以对group对象进行命名
之前.group() 函数默认返回整个匹配的结果, 如果未在正则表达式中对group进行命名,那么可以使用从左到右的数字索引,如果命名之后,那么可以使用 名字做索引
假如你想要验证邮件地址,并且检查 name 和 host, 这个时候分组是有好处的
在存在 group 时, re库的一些常用函数的返回值会有特殊的形式,详情请见前一篇文章
statement = "please contact us at : regex_helper@wclsn.com"
match = re.search(r"([\w\.-]+)@([\w\.-]+)", statement)
if statement: # 如果待校验邮件地址非空
print("邮件地址:", match.group())
print("用户名:", match.group(1))
print("Host:", match.group(2))
邮件地址 regex_helper@wclsn.com
用户名 regex_helper
Host wclsn.com
# namedgroups :语法 ?P<name>
match = re.search(r'(?P<email>(?P<username>[\w\.-]+)@(?P<host>[\w\.-]+))', statement)
if statement:
print("邮件地址:", match.group('email'))
print("用户名:", match.group('username'))
print("Host:", match.group('host'))
邮件地址: regex_helper@wclsn.com
用户名: regex_helper
Host: wclsn.com
greedy or non-greedy matching
贪婪匹配或者 非贪婪匹配
前者: .(dot match everything) + * :也即尽可能的进行匹配
# 贪婪匹配并不总是好的
#匹配一个 html tag的前半部分
heading = r"<h1>TITLE</h1>"
re.match(r'<.*>', heading).group()
'<h1>TITLE</h1>'
# 解决方案一 采用准确的character class
print( re.match(r'<[A-Za-z][\w]*>', heading).group() )
# 解决方案二 使用 greedy qualifer *? (这个量词的作用是进行字符数尽可能少的匹配)
print( re.match(r'<.*?>', heading).group() )
<h1>
<h1>
flag value(前面提到过)
re.I (IGNORECASE):正则表达式匹配时忽略大小写
re.S(DOTALL): dot match everything(including newline)
re.M(MULTILINE): Allows start of string (^) and end of string ($) anchor to match newlines as well.
re.X(re.VERBOSE):允许在正则表达式中写whitespace和注释以提升表达式的可读性
statement = "Please contact us at: support@cnblogs.com, regex_helper@wclsn.com"
# Using the VERBOSE flag helps understand complex regular expressions
pattern = re.compile(r"""
[\w\.-]+ #First part
@ #Matches @ sign within email addresses
[\w\.-]+ # host
""", re.X | re.I)
addresses = re.findall(pattern, statement)
for address in addresses:
print("Address: ", address)
Address: support@cnblogs.com
Address: regex_helper@wclsn.com
以上就是本次教程的主要内容,主要是将第一次教程中所介绍的正则表达式的基本概念与第二次教程中所介绍的python re module 的函数接口结合到一起,具体的去说明python中的正则匹配。其实正则表达式可以使用的空间很广,并不一定要拘泥于python,如常见的文本编辑器往往支持正则查找与匹配(vscode vim等)还有很多可以使用到正则表达式的应用,因此学习瓶颈往往在正则表达式的书写,而不在使用的编程语言。只有在实践中不断的使用正则表达式并积累经验,才可以真正的做到从心所欲不逾矩。
正则表达式快速入门三: python re module + regex 匹配示例的更多相关文章
- 前端学习 node 快速入门 系列 —— 模块(module)
其他章节请看: 前端学习 node 快速入门 系列 模块(module) 模块的导入 核心模块 在 初步认识 node 这篇文章中,我们在读文件的例子中用到了 require('fs'),在写最简单的 ...
- Jupyter 快速入门——写python项目博客非常有用!!!
from:https://blog.csdn.net/m0_37338590/article/details/78862488 一.简介: Jupyter Notebook(此前被称为 IPython ...
- C#正则表达式快速入门
作者将自己在学习正则表达式中的心得和笔记作了个总结性文章,希望对初学C#正则表达式的读者有帮助. [内容] 什么是正则表达式 涉及的基本的类 正则表达式基础知识 构建表达式基本方法 编写一个检验程序 ...
- pip快速下载安装python 模块module
g刚开始学习python时,每次想要安装某个module,都到处找module的安装包(exe.whl等) 装setuptools,然后在cmd里用easy_install装pip,然后用pip装你要 ...
- 快速入门:Python简单实例100个(入门完整版)
Python3 100例 文章目录 Python3 100例 实例001:数字组合 实例002:“个税计算” 实例003:完全平方数 实例004:这天第几天 实例005:三数排序 实例006:斐波那契 ...
- Mysql快速入门(三)
MySQL性能优化之查看执行计划explain 介绍: (1).MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发 ...
- jquery快速入门三
事件 常用事件 click(function(){.......}) #触发或将函数绑定到指定元素的click事件 hover(function(){.....}) 当鼠标指针悬停在上面时触发.... ...
- python gui tkinter快速入门教程 | python tkinter tutorial
本文首发于个人博客https://kezunlin.me/post/d5c57f56/,欢迎阅读最新内容! python tkinter tutorial Guide main ui messageb ...
- Linux Bash Shell快速入门 (三)
forfor 循环结构与 C 语言中有所不同,在 BASH 中 for 循环的基本结构是: for $var in dostatmentsdone 其中 $var 是循环控制变量, 是 $var 需要 ...
- Ant快速入门(三)-----定义生成文件
适应Ant的关键就是编写生成文件,生成文件定义了该项目的各个生成任务(以target来表示,每个target表示一个生成任务),并定义生成任务之间的依赖关系. Ant生成文件的默认名为build.xm ...
随机推荐
- 终于把 7 年前的 Docker Hub 账号恢复了
折腾 docker,向 Docker Hub 提交镜像的时候发现原来自己在 2014 年就已经注册过 Docker Hub 的账号了,而且在 https://hub.docker.com/u/shen ...
- 预测 motif 的计算原理
本文章来源于简书,作者小潤澤,已获原作者授权:部分内容有调整. 前言 蛋白质中功能的基本单元是 domain,是一种特殊的三维结构,不同结构的 domain 与其他分子特异性结合从而发挥功能.与此类似 ...
- R 数据可视化 : 热图
本文作者蒋刘一琦,自嘲是一个有艺术追求的生信狗,毕业于浙江大学生物信息学专业,目前在复旦大学就读研究生,研究方向为宏基因组. 在生物信息领域我们常常使用 R 语言对数据可视化.在对数据可视化的时候,我 ...
- API NEWS | 三个Argo CD API漏洞
欢迎大家围观小阑精心整理的API安全最新资讯,在这里你能看到最专业.最前沿的API安全技术和产业资讯,我们提供关于全球API安全资讯与信息安全深度观察. 本周,我们带来的分享如下: 关于三个Argo ...
- CAPL 脚本基本语句
CAPL(Communication Access Programming Language)是一种用于汽车通信网络分析和仿真的脚本语言.以下是CAPL脚本的基本语句: 1.变量声明 variable ...
- Android-NDK开发——基本概念
在Android开发中,有时候出于安全,性能,代码共用的考虑,需要使用C/C++编写的库.虽然在现代化工具链的支持下,这个工作的难度已经大大降低,但是毕竟万事开头难,初学者往往还是会遇到很多不可预测的 ...
- Aerospike架构设计与实现细节
目录 1. 引言 2. 技术原理及概念 2.1. 基本概念解释 2.2. 技术原理介绍 2.3. 相关技术比较 3. 实现步骤与流程 3.1. 准备工作:环境配置与依赖安装 3.2. 核心模块实现 3 ...
- 好用到飞起的新项目「GitHub 热点速览」
虽然本周 GitHub 热榜都是一些熟悉的面孔,但还是有不少新开源的项目,比如受启发于 Stripe IDs 的 UUIDv7 扩展 typeid,相信有了它,数据标识问题就迎刃而解了.此外,还有刚开 ...
- CANopen转ProfiNet网关在大跨径门机起重设备同步纠偏控制应用案例
大型门机起重设备纠偏控制系统采用CanOpen通讯协议,而PLC使用的是ProfiNet协议,看似不兼容的两种协议如何实现互通?今天我们来看一下这个案例. 通过捷米特JM-COP-PN设置纠偏系统的参 ...
- 即构SDK10月迭代:新增多款语音音效、外部采集码流控制及Android SDK 最低支持操作系统版本调整
即构SDK10月迭代内容来喽~~~ 本月调整了Android SDK 最低支持的操作系统版本,新增了流删除回调原因, 4种变音效果和外部采集码流控制,同时还对登录房间.媒体播放器以及第三方库进行了优化 ...