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 encode和decode的妙用
Sep 02 Python
利用Python的Django框架生成PDF文件的教程
Jul 22 Python
python爬虫_微信公众号推送信息爬取的实例
Oct 23 Python
pip安装Python库时遇到的问题及解决方法
Nov 23 Python
利用pyinstaller打包exe文件的基本教程
May 02 Python
用Python实现最速下降法求极值的方法
Jul 10 Python
python实现二分类的卡方分箱示例
Nov 22 Python
windows环境中利用celery实现简单任务队列过程解析
Nov 29 Python
Python中SQLite如何使用
May 27 Python
浅谈keras.callbacks设置模型保存策略
Jun 18 Python
Python通过zookeeper实现分布式服务代码解析
Jul 22 Python
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
Jun 07 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
数据库相关问题
2006/10/09 PHP
php设计模式 Decorator(装饰模式)
2011/06/26 PHP
PHP针对字符串开头和结尾的判断方法
2016/07/11 PHP
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
比较详细的关于javascript 解析json的代码
2009/12/16 Javascript
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
下拉框select的绑定示例
2014/09/04 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
js仿iphone秒表功能 计算平均数
2017/01/11 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
JS图片懒加载技术实现过程解析
2020/07/27 Javascript
用Python编写简单的微博爬虫
2016/03/04 Python
详解Python中最难理解的点-装饰器
2017/04/03 Python
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
Python编程argparse入门浅析
2018/02/07 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
win10下python2和python3共存问题解决方法
2019/12/23 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
Python selenium模块实现定位过程解析
2020/07/09 Python
英国复古和经典球衣网站:Vintage Football Shirts
2018/10/05 全球购物
营销人才自我鉴定范文
2013/12/25 职场文书
学生会副主席竞聘书
2014/03/31 职场文书
职业生涯规划书结束语
2014/04/15 职场文书
合作协议书怎么写
2014/04/18 职场文书
安全生产大检查方案
2014/05/07 职场文书
体育运动口号
2014/06/09 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
党员批评与自我批评范文
2014/09/23 职场文书
学生偷窃检讨书
2014/09/25 职场文书
交通事故代理词范文
2015/05/23 职场文书
飞越疯人院观后感
2015/06/09 职场文书
二年级数学教学反思
2016/02/16 职场文书