Java及python正则表达式详解


Posted in Python onDecember 27, 2017

正则表达式语法及常用元字符:

正则表达式有元字符及不同组合来构成,通过巧妙的构造正则表达式可以匹配任意字符串,并完成复杂的字符串处理任务。

常用的元字符有:

其中在使用反斜线时要注意:如果以‘\'开头的元字符与转义字符相同,则需要使用‘\\'或者原始字符串,在字符串前面加上字符‘r'或‘R'。原始字符串可以减少用户的输入,主要用于‘\\',主要用于正则表达式和文件路径字符串,如果字符串以一个‘\'结束,则需要多加一个斜线,以‘\\'结束。

Java及python正则表达式详解

\  :将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。

常用正则表达式的写法:

‘[a-zA-Z0-9]':匹配字母或数字
‘[^abc]':匹配除abc之外的字母
‘p(ython|erl)'匹配Python和perl
‘(pattern)*'匹配0次或多次
‘(pattern)+'匹配1次或多次
‘(pattern){m,n}'匹配m_n次
‘(a|b)*c'匹配0-n次a或b后面紧跟c
‘^[a-zA-Z]{1}([a-zA-Z0-9\._]){4,19}$'匹配20个字符以字母开始
‘^(\w){6,20}$'匹配6-20个单词字符
‘^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$'匹配IP
‘^[a-zA-Z]+$'检查字符中只包含英文字母
‘\w+@(\w+\.)\w+$'匹配邮箱
‘[\u4e00-\u9fa5]'匹配汉字
‘^\d{18|\d{15}$'匹配身份证
‘\d{4}-\d{1,2}-\d{1,2}'匹配时间
‘^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[,._]).{8,}$)'判断是否为强密码
‘(.)\\1+'匹配任意字符的一次或多次出现

re模块常用方法介绍:

compile(pattern[,flags])创建模式对象
search(pattern,string[,flags])在整个字符中寻找模式,返回match对象或者None
match(pattern,string[,flags])从字符串的开始处于匹配模式,返回匹配对象
findall(pattern,string[,flags]):列出匹配模式中的所有匹配项
split(pattern,string[,maxsplit=0])根据匹配模式分割字符串
sub(pat,repl,string[,count=0])将字符串中所有pat匹配项用repl替换
escape(string)将字符中的所有特殊正则表达式字符转义

match,search,findall区别

match在字符串开头或指定位置进行搜索,模式必须出现在开头或指定位置;
search方法在整个字符串或指定位置进行搜索;
findall在字符串中查找所有符合正则表达式的字符串并以列表返回。

子模式与match对象

正则表达式中match和search方法匹配成功后都会返回match对象,其中match对象的主要方法有group()(返回匹配的一个或多个子模式内容),groups()(方法返回一个包含匹配所有子模式内容的元组),groupdict()(方法返回一个包含匹配所有子模式内容的字典),start()(返回子模式内容的起始位置),end()(返回子模式内容的结束位置)span()(返回包含指定子模式内容起始位置和结束位置前一个位置的元组)

代码演示

>>> import re
>>> m = re.match(r'(\w+) (\w+)','Isaac Newton,physicist')
>>> m.group(0)
'Isaac Newton'
>>> m.group(1)
'Isaac'
>>> m.group(2)
'Newton'
>>> m.group(1,2)
('Isaac', 'Newton')
>>>m=re.match(r'(?P<first_name>\w+)(?P<last_name>\w+)','Malcolm Reynolds')
>>> m.group('first_name')
'Malcolm'
>>> m.group('last_name')
'Reynolds'
>>> m.groups()
('Malcolm', 'Reynolds')
>>> m.groupdict()
{'first_name': 'Malcolm', 'last_name': 'Reynolds'}

验证并理解子模式扩展语法的功能

>>> import re
>>> exampleString = '''There should be one--and preferably only one--obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never. 
Although never never is often better than right now.'''
>>> pattern = re.compile(r'(?<=\w\s)never(?=\s\w)')
>>> matchResult = pattern.search(exampleString)
>>> matchResult.span()
(171, 176)
>>> pattern = re.compile(r'(?<=\w\s)never')
>>> matchResult = pattern.search(exampleString)
>>> matchResult.span()
(154, 159)
>>> pattern = re.compile(r'(?:is\s)better(\sthan)')
>>> matchResult = pattern.search(exampleString)
>>> matchResult.span()
(139, 153)
>>> matchResult.group(0)
'is better than'
>>> matchResult.group(1)
' than'
>>> pattern = re.compile(r'\b(?i)n\w+\b')
>>> index = 0
>>> while True:
 matchResult = pattern.search(exampleString,index)
 if not matchResult:
 break
 print(matchResult.group(0),':',matchResult.span(0))
 index = matchResult.end(0)

not : (90, 93)
Now : (135, 138)
never : (154, 159)
never : (171, 176)
never : (177, 182)
now : (210, 213)
>>> pattern = re.compile(r'(?<!not\s)be\b')
>>> index = 0
>>> while True:
 matchResult = pattern.search(exampleString,index)
 if not matchResult:
 break
 print(matchResult.group(0),':',matchResult.span(0))
 index = matchResult.end(0)

be : (13, 15)
>>> exampleString[13:20]
'be one-'
>>> pattern = re.compile(r'(\b\w*(?P<f>\w+)(?P=f)\w*\b)')
>>> index = 0
>>> while True:
 matchResult = pattern.search(exampleString,index)
 if not matchResult:
 break
 print(matchResult.group(0),':',matchResult.group(2))
 index = matchResult.end(0)+1

unless : s
better : t
better : t
>>> s = 'aabc abbcd abccd abbcd abcdd'
>>> p = re.compile(r'(\b\w*(?P<f>\w+)(?P=f)\w*\b)')
>>> p.findall(s)
[('aabc', 'a'), ('abbcd', 'b'), ('abccd', 'c'), ('abbcd', 'b'), ('abcdd', 'd')]

以上就是关于python正则表达式的相关内容,更多资料请查看三水点靠木以前的文章。 

Python 相关文章推荐
Python实现pdf文档转txt的方法示例
Jan 19 Python
python调用系统ffmpeg实现视频截图、http发送
Mar 06 Python
python中datetime模块中strftime/strptime函数的使用
Jul 03 Python
Python日志模块logging基本用法分析
Aug 23 Python
Python干货:分享Python绘制六种可视化图表
Aug 27 Python
python数据结构学习之实现线性表的顺序
Sep 28 Python
python实现支付宝转账接口
May 07 Python
关于PyTorch源码解读之torchvision.models
Aug 17 Python
numpy.ndarray 实现对特定行或列取值
Dec 05 Python
python实现取余操作的简单实例
Aug 16 Python
Python猫眼电影最近上映的电影票房信息
Sep 18 Python
Python将QQ聊天记录生成词云的示例代码
Feb 10 Python
python matplotlib画图实例代码分享
Dec 27 #Python
python爬虫使用cookie登录详解
Dec 27 #Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 #Python
Python并发编程协程(Coroutine)之Gevent详解
Dec 27 #Python
利用 python 对目录下的文件进行过滤删除
Dec 27 #Python
python中使用%与.format格式化文本方法解析
Dec 27 #Python
python类的方法属性与方法属性的动态绑定代码详解
Dec 27 #Python
You might like
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
jquery.pagination.js 无刷新分页实现步骤分享
2012/05/23 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
编写高质量JavaScript代码的基本要点
2016/03/02 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
nodejs中模块定义实例详解
2017/03/18 NodeJs
vue组件间通信子与父详解(二)
2017/11/07 Javascript
three.js中文文档学习之创建场景
2017/11/20 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
2018/07/06 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
2019/09/12 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
Python 自动化表单提交实例代码
2017/06/08 Python
python数字图像处理实现直方图与均衡化
2018/05/04 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
Python小程序 控制鼠标循环点击代码实例
2019/10/08 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
2020/07/01 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
Python如何急速下载第三方库详解
2020/11/02 Python
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
Servlet的生命周期
2013/08/25 面试题
客服实习的个人自我鉴定
2013/10/20 职场文书
应届生学校辅导员求职信
2013/11/07 职场文书
付款委托书范本
2014/04/04 职场文书
入团介绍人意见范文
2015/06/04 职场文书
小学总务工作总结
2015/08/13 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers