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入门之语句(if语句、while语句、for语句)
Jan 19 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
Nov 11 Python
Python连接phoenix的方法示例
Sep 29 Python
1 行 Python 代码快速实现 FTP 服务器
Jan 25 Python
python基础教程项目三之万能的XML
Apr 02 Python
Python根据文件名批量转移图片的方法
Oct 21 Python
10分钟教你用Python实现微信自动回复功能
Nov 28 Python
python利用插值法对折线进行平滑曲线处理
Dec 25 Python
python 动态生成变量名以及动态获取变量的变量名方法
Jan 20 Python
python实现网页自动签到功能
Jan 21 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
Aug 09 Python
pycharm无法安装cv2模块问题
May 20 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
BBS(php & mysql)完整版(一)
2006/10/09 PHP
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
PHP按符号截取字符串的指定部分的实现方法
2018/09/10 PHP
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
JavaScript闭包 懂不懂由你反正我是懂了
2011/10/21 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
javascript 手动给表增加数据的小例子
2013/07/10 Javascript
jquery自动切换tabs选项卡的具体实现
2013/12/24 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
完善的jquery处理机制
2016/02/21 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
2017/06/03 Javascript
node的process以及child_process模块学习笔记
2018/03/06 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
Vue实现自定义下拉菜单功能
2018/07/16 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
python如何实现内容写在图片上
2018/03/23 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
abstract是什么意思
2012/02/12 面试题
行政文员岗位职责
2013/11/08 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
工作简报怎么写
2015/07/21 职场文书
宿舍卫生管理制度
2015/08/05 职场文书
图文详解Nginx版本平滑升级方案
2021/09/15 Servers