python正则表达式及使用正则表达式的例子


Posted in Python onJanuary 22, 2018

正则表达式

正则表达用来匹配字符串

正则表达式匹配过程

  1. 依次拿出表达式和文本中的字符串进行比价
  2. 如果每个字符都能匹配,则匹配成功;一旦有匹配不成功的字符,则匹配失败
  3. 如果有量词和边界,则匹配过程稍微有些不同

正则表达式语法规则

语法 说明 表达式实例 匹配字符串
字符
. 匹配除换行"\n"外的任意字符串 abc abc
\ 转义字符,使后一个字符改变原来的意思 a\\c a\c
[...] 字符集,对应的位置可以是字符集中任意字符,字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。第一个字符如果是^则表示取反,如[^abc]表示不是abc中的其他字符。所有的特殊的字符在字符集中都失去其原有的特殊含义。在字符集中使用^、]或-,可以使用转义字符匹配它们 a[bcd]e abe ace ade
预定义字符集
\d 数字:[0-9] a\dc a1c
\D 非数字:[^0-9] a\Dc abc
\s 空白字符:[\t\r\n\f\v] a\sc a c
\S 非空白字符:[^\s] a\Sc abc
\w 单词字符:[a-zA-z0-9_] a\wc abc
\W 非单词字符:[^\w] a\Wc a c
数量词
* 匹配一个字符串0或无限次 abc* ab abc abccc
+ 匹配一个字符串1次或无限次 abc+ abc abccc
? 匹配一个字符串0次或1次 abc? ab abc
{m} 匹配一个字符串m次 abc{2} abcc
{m,n} 匹配一个字符串m到n次 abc{2,3} abcc abccc
边界匹配
^ 匹配字符串开头 ^abc abc
$ 匹配字符串末尾 abc$ abc
\A 匹配字符串开始 \Aabc abc
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 abc\Z abc
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
逻辑分组
| 匹配|表达式左右的任意一个 abc|def abc def
(...) 作为分组,每遇到一个(,分组编号加1,使用分组的好处是匹配的子串会保存到一个子组,便于以后使用 (abc){2} abcabc
(?P...) 分组除原有编号外,再加一个别名 (?Pabc){2} abcabc
\ 引用编号为number的分组匹配到的字符串 (\d)ab\1 1ab1 5ab5
(?P=name) 应用别名为name的分组匹配到的字符串 (?Pabc)ee(?P=name) abceeabc
特殊构造(不分组)
(?:...) (...)的不分组版本,用于|或后接数量词 (?:abc){2} abcabc
(?iLmsux) iLmsux中的每个字符代表正则表达式的一种匹配模式,只能用在正则表达式开头,可选多个 (?i)abc AbC
(?#...) 将#后面的字符当做注释忽略 abc(?#comment)def abcdef
(?=...) 之后的字符串表达式需要匹配才能成功,不消耗字符串内容 a(?=\d) 后面是数字的a
(?!...) 之后的字符串表达式需要不匹配才能成功,不消耗字符串内容 a(?!\d) 后面不是数字的a
(? 之前的字符串表达式需要匹配才能成功,不消耗字符串内容 (? 前面是数字的a
(? 之前的字符串表达式需要不匹配才能成功,不消耗字符串内容 (? 前面不是数字的a
(?(id/name)yes_ pattern|no_parttern) 如果匹配到分组为id或别名name的字符串成功匹配,则需要匹配yes_pattern 不成功,怎需要匹配no_pattern (\d)abc(?(1)\d|def) 1abc3 abcdef

贪婪模式和非贪婪模式

贪婪模式是尽可能多的匹配字符串,python默认为贪婪模式,非贪婪模式尽可能少的匹配字符串,在正则表达式后面加个?表示非贪婪模式。例如:字符串abcccb,贪婪模式正则表达式为ab.*c,非贪婪模式的正则表达式为ab.*?c,贪婪模式结果为abccc,非贪婪模式结果为abc,再比如字符串abbb,贪婪模式正则表达式为ab?,非贪婪模式正则表达为ab??,贪婪模式结果为ab,非贪婪结果为a。

python的re模块

re模块的方法:

1.compile(pattern[,flag]):对正则表达式pattern进行编译,编译后比直接查找速度快

2.match(patter,string[,flag]):从字符串string的开始就匹配,若匹配成功,则返回匹配对象,否则返回None(None对象没有group()和groups()方法,不判断直接调用这两个方法,则会出现异常)

3.search(pattern,string[,flag]):从字符串中查找,若匹配成功,则返回匹配对象,否则返回None

4.findall(pattern,string[,flag]):在字符串 string 中查找正则表达式模式 pattern 的所有(非重复)出现;返回一个匹配对象的列表

5.finditer(pattern,string[, flags])b 和 findall()相同,但返回的不是列表而是迭代器;对于每个匹配,该迭代器返回一个匹配对象

6.split(pattern,string, max=0) 根据正则表达式 pattern 中的分隔符把字符 string 分割为一个列表,返回成功匹配的列表,最多分割 max 次(默认是分割所有匹配的地方)

7.sub(pattern, repl, string, max=0) 把字符串 string 中所有匹配正则表达式 pattern 的地方替换成字符串 repl,如果 max 的值没有给出, 则对所有匹配的地方进行替换

匹配对象的方法和属性:

  1. string:匹配时所使用的文本
  2. re:匹配时使用的pattern对象
  3. group(num=0) 返回全部匹配对象(或指定编号是 num 的子组)
  4. groups() 返回一个包含全部匹配的子组的元组(如果没有成功匹配,就返回一个空元组)

参数flag:

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

python使用正则表达式的例子

>>> import re
>>> pattern = re.compile(r'foo')
>>> res1 = re.search(pattern,'foo')
>>> res1.group() # 返回的是匹配对象,需要调用group()方法,显示所有的匹配对象
'foo'
>>> res1.groups()# 因为没有子组(即正则表达式中没有分组),返回空元组
()
>>> res2 = re.findall(pattern,'foobbfoo')
>>> res2 # 直接返回的是一个列表,包含所有匹配的字符
['foo', 'foo']
>>> pattern2 = re.compile(r'(\d+)aa')
>>> res3 = re.search(pattern2,'bb32aa')
>>> res3.group() # 返回所有的匹配的对象
'32aa'
>>> res3.groups() # 对比res1的groups(),正则里有分组,返回匹配到的分组
('32',)
>>> res4 = re.findall(pattern2,'bb32aacc5aacc')
>>> res4 # 对比res2,返回一个列表,但只包含所匹配分组里面的字符,
['32', '5']

总结

以上所述是小编给大家介绍的python正则表达式及使用正则表达式的例子,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python警察与小偷的实现之一客户端与服务端通信实例
Oct 09 Python
编写Python脚本抓取网络小说来制作自己的阅读器
Aug 20 Python
python实现二维码扫码自动登录淘宝
Dec 27 Python
Python探索之Metaclass初步了解
Oct 28 Python
python基础教程项目二之画幅好画
Apr 02 Python
Python里字典的基本用法(包括嵌套字典)
Feb 27 Python
Django中提示消息messages的设置方式
Nov 15 Python
使用python实现回文数的四种方法小结
Nov 24 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
Feb 24 Python
详解Pycharm出现out of memory的终极解决方法
Mar 03 Python
python打包多类型文件的操作方法
Sep 21 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
Dec 29 Python
Python深度优先算法生成迷宫
Jan 22 #Python
Python使用Tkinter实现机器人走迷宫
Jan 22 #Python
Python实现简单文本字符串处理的方法
Jan 22 #Python
Python简单实现控制电脑的方法
Jan 22 #Python
Zookeeper接口kazoo实例解析
Jan 22 #Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 #Python
python的Crypto模块实现AES加密实例代码
Jan 22 #Python
You might like
php中获得视频时间总长度的另一种方法
2011/09/15 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
php获取指定数量随机字符串的方法
2017/02/06 PHP
Yii 2.0在Grid中格式化时间方法示例
2017/06/06 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
JS针对Array的各种操作汇总
2016/11/29 Javascript
jQuery 控制文本框自动缩小字体填充
2017/06/16 jQuery
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
JavaScript自定义超时API代码实例
2020/04/30 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
在Django的模型中添加自定义方法的示例
2015/07/21 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
linux下python中文乱码解决方案详解
2019/08/28 Python
pycharm 设置项目的根目录教程
2020/02/12 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
基于python 将列表作为参数传入函数时的测试与理解
2020/06/05 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
Django model class Meta原理解析
2020/11/14 Python
JD Sports意大利:英国篮球和运动时尚的领导者
2017/10/29 全球购物
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
中医药大学市场营销专业自荐信
2013/09/29 职场文书
大学生旅游业创业计划书
2014/01/29 职场文书
2014政务公开实施方案
2014/02/19 职场文书
消防标语大全
2014/06/07 职场文书
学校搬迁方案
2014/06/15 职场文书
求职信的正确写法
2014/07/10 职场文书
户籍证明模板
2014/09/28 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP