Python中正则表达式对单个字符,多个字符和匹配边界等使用


Posted in Python onJanuary 27, 2021

Regular Expression,正则表达式,又称正规表示式、正规表示法、正则表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。

Python 自1.5版本起增加了re 模块。re 模块使 Python 语言拥有全部的正则表达式功能。

1.re.match函数

   python用re.match函数从字符串的起始位置匹配一个模式,若字符串匹配正则表达式,则match方法返回匹配对象(Match Object),否则返回None(注意不是空字符串"")。匹配对象Macth Object具有group方法,用来返回字符串的匹配部分。

   函数语法:re.match(pattern, string, flags) ;pattern是正则表达式,string需要匹配的字符串,flags为可选参数修饰符。

# 导入re模块,注意match函数是从起始位置匹配的。如果起始位置匹配失败,则返回None
import re
#match()函数适合匹配是否以xxxx开始的字符串,因为其从头开始匹配的
ret = re.match("abc","aBCabc",re.I) #可选参数re.I表示忽略大小写,后续详细解释。
print(ret.group()) #aBC
ret1 = re.match("abc","aBCabc")
print(ret1.group()) # 'NoneType' object has no attribute 'group'

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

2.正则表达式的语法

2.1正则表达式对字符(单个字符)的表示

字符 功能
. 匹配任意1个字符(除了\n),注意因为.表示任意一个字符,所以如果匹配‘.'则需要用转义字符\.来表示
[ ] 匹配[ ]中列举的字符,如果[a-zA-Z0-9],[a-zA-Z]表示所有字母和数字,后者表示所有字母,注意中间没有空格符号。
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配单词字符,即a-z、A-Z、0-9、_
\W 匹配非单词字符
# 导入re模块
import re
#1.测试.的使用,匹配任意字符开始的字符串
str='abc'
ret =re.match("..",str)
print(ret.group()) #ab.用两个..就表示只要str字符串开头是两个字符即可。
ret1 = re.match("....",str) #这种情况则会报错,因为str只有三个字符。
 
#2.匹配[]范围内的任意一个字符开头的字符串
str1 = "abcABC*?//"
str2 = "3afasdlfadsf"
ret2 = re.match("[a-z]",str1).group() #a
ret3 = re.match("[123456]",str2).group() #3,[1-6]等价[123456]
 
#3./d的使用,表示匹配任意一个数字
str3 = "第5名是我"
ret4 = re.match("第\d名",str3).group()
print(ret4) #第5名
 
ret4 = re.match("第[0-9]名",str3) #同样是表示0-9任意一个,[0-9]和\d效果一样
print(ret4.group()) #第5名

 总结:注意上面对字符的匹配都是表示一个任意字符,或者某个范围内的任意一个字符,属于单个字符匹配。而实际开发中肯定都是用一个子串(多个字符)去匹配整个字符串。那么如何表示呢,请继续下去。

2.2正则表达式匹配多个字符:数量的表示

匹配多个字符的相关格式,其实就是单个字符加上数量。注意下面数量的匹配都是针对前一个字符。

字符 功能
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{m,n} 匹配前一个字符出现从m到n次
# 导入re模块
import re
 
#1.匹配第一个是大写字母,第二个小写字母,后面只要是小写字母即可。
ret = re.match("[A-Z][a-z]*","Aafngsdfgnlsdf1224343")
print(ret.group()) #Aafngsdfgnlsdf
ret1 = re.match("[A-Z][a-z]*","AaAaaa34bbb")
print(ret1.group()) #Aa ,因为后面不是小写字母所以没匹配到。
 
#匹配下面字符串是否以字母或者下划线开头
ret = re.match("[a-zA-Z_]+[\w_]*","name1") #解释1:[a-zA-Z_]+字母下划线至少出现一次
print(ret.group()) #name1
 
ret = re.match("[a-zA-Z_]+[\w_]*","_name") #解释2:[\w_]*表示字母,数据下划线出现任意次
print(ret.group()) #_name
 
ret = re.match("[a-zA-Z_]+[\w_]*","2_name")
#print(ret.group()) #报错,因为匹配不上,返回None.
 
 
#3.匹配前面字符出现0次或者1次使用?
ret = re.match("[1-9]?[0-9]","7")
print(ret.group()) #7
 
ret = re.match("[1-9]?[0-9]","33")
print(ret.group()) #33
 
ret = re.match("[1-9]?[0-9]","09")
print(ret.group()) #0
 
#4.前面字符出现n此,或者m-n范围内的任意次
ret = re.match("[a-zA-Z0-9_]{6}","dsa2A9nfdsf")
print(ret.group()) #dsa2A9,匹配前6位是数字字符下划线即可
 
ret = re.match("[a-zA-Z0-9_]{3,8}","aSjsd239344")
ret1 = re.match("[a-zA-Z0-9_]{3,8}","aSjs")
print(ret1.group()) #aSjs,注意匹配前一个字符出现3-8次,只要这个范围内都算匹配成功,按实际匹配
print(ret.group()) #aSjsd239 匹配前一个字符出现3到8次
 
ret = re.match("[a-z0-9A-Z_]{3,}","a2")
print(ret.group()) #至少出现3次,所以如果只有两个的话,返回None,调用报错。

总结:单个字符匹配,多个字符匹配上面都已经演示过了,基本可以完成大多数字符串的匹配了。但是上面过于字符串的匹配都是从头开始匹配的,而实际开发中可能是从字符串中间,后者结尾开始匹配的。keep reading....

2.3.正则表达式:匹配边界的问题

字符 功能
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界,'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
# 导入re模块
import re
 
# 匹配以@qq.com邮箱结尾的邮箱地址
#1.不适用匹配字符串结尾的$来实现,注意.要用转义字符,一般邮箱的长度都是4-30位
ret = re.match("[\w]{4,30}@qq\.com", "xiaoWang@qq.com")
print(ret.group()) #xiaoWang@qq.com
 
 
# 通过$来确定末尾,效率更高
ret = re.match("[\w]{4,30}@qq\.com$", "xiaoWang@qq.com")
print(ret.group()) #xiaoWang@qq.com
 
ret = re.match("[\w]{4,30}@qq\.com$", "xiaoWang@qq.com.cn")
#print(ret.group()) #报错

到此这篇关于Python中正则表达式对单个字符,多个字符和匹配边界等使用的文章就介绍到这了,更多相关Python 单字符,多字符匹配内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
复制粘贴功能的Python程序
Apr 04 Python
详解Python当中的字符串和编码
Apr 25 Python
如何用itertools解决无序排列组合的问题
May 18 Python
Python中static相关知识小结
Jan 02 Python
Matplotlib 生成不同大小的subplots实例
May 25 Python
Python爬虫包BeautifulSoup简介与安装(一)
Jun 17 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
Aug 06 Python
Django接收自定义http header过程详解
Aug 23 Python
Python实现的北京积分落户数据分析示例
Mar 27 Python
python小白学习包管理器pip安装
Jun 09 Python
简单了解Django项目应用创建过程
Jul 06 Python
python正则表达式re.match()匹配多个字符方法的实现
Jan 27 #Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 #Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 #Python
Python利用socket模块开发简单的端口扫描工具的实现
Jan 27 #Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 #Python
python利用appium实现手机APP自动化的示例
Jan 26 #Python
python 基于opencv去除图片阴影
Jan 26 #Python
You might like
php中将地址生成迅雷快车旋风链接的代码[测试通过]
2011/04/20 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
jQuery html()方法使用不了无法显示内容的问题
2014/08/06 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
10个JavaScript中易犯小错误
2016/02/14 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
详解Node.js模板引擎Jade入门
2018/01/19 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
2019/01/18 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
微信小程序如何获取地址
2019/12/24 Javascript
Python查询阿里巴巴关键字排名的方法
2015/07/08 Python
在Python的Flask框架中构建Web表单的教程
2016/06/04 Python
学习Python爬虫的几点建议
2020/08/05 Python
Python 创建守护进程的示例
2020/09/29 Python
python代码实现图书管理系统
2020/11/30 Python
eBay爱尔兰站:eBay.ie
2019/08/09 全球购物
Currentbody美国/加拿大:美容仪专家
2020/03/09 全球购物
写出程序把一个链表中的接点顺序倒排
2014/04/28 面试题
shallow copy和deep copy的区别
2016/05/09 面试题
会计人员岗位职责
2014/03/19 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
环境科学专业求职信
2014/08/04 职场文书
道路交通事故人身损害赔偿协议书
2014/11/19 职场文书
年会邀请函范文
2015/01/30 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python