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的Django框架中的数据过滤功能
Jul 17 Python
python xlsxwriter库生成图表的应用示例
Mar 16 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
django-初始配置(纯手写)详解
Jul 30 Python
python 两个数据库postgresql对比
Oct 21 Python
Django框架下静态模板的继承操作示例
Nov 08 Python
使用Python第三方库pygame写个贪吃蛇小游戏
Mar 06 Python
Python3 mmap内存映射文件示例解析
Mar 23 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
May 16 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
Sep 05 Python
通俗易懂了解Python装饰器原理
Sep 17 Python
如何使用pycharm连接Databricks的步骤详解
Sep 23 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全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
2012/05/05 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
2019/09/29 PHP
js获取当前页面路径示例讲解
2014/01/08 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
简单的js计算器实现
2016/10/26 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
JavaScript实现图片合成下载的示例
2020/11/19 Javascript
[03:36]2014DOTA2 TI小组赛综述 八强诞生进军钥匙球馆
2014/07/15 DOTA
Python fileinput模块使用介绍
2014/11/30 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
浅谈python jieba分词模块的基本用法
2017/11/09 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
django ajax json的实例代码
2018/05/29 Python
python库lxml在linux和WIN系统下的安装
2018/06/24 Python
python 实现将字典dict、列表list中的中文正常显示方法
2018/07/06 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
Speedo速比涛中国官方网站:全球领先泳装运动品牌
2018/04/24 全球购物
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
设立有限责任公司出资协议书
2014/11/01 职场文书
2014年科协工作总结
2014/12/09 职场文书
婚礼父母答谢词
2015/01/04 职场文书