Python编程--正则表达式

来源:互联网 发布:软件企业营改增 编辑:程序博客网 时间:2024/06/05 08:27

1. 正则表达式概述

正则表达式,(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。

2. re模块

re 模块使 Python 语言拥有全部的正则表达式功能。
re 模块提供了一些函数,这些函数使用一个模式字符串做为它们的第一个参数,用于正则表达式匹配和替换。

2.1 re模块的使用

re.match 函数

re.match 尝试从字符串的起始位置匹配一个模式,若字符串起始位置匹配正则表达式,则match方法返回匹配对象(Match Object),如果不是起始位置匹配成功的话,match()就返回none(注意不是“空字符串”)。

语法:

re.match(pattern, string, flags=0)

参数:
 pattern – 匹配的正则表达式
 
 string – 要匹配的字符串。
 
 flags – 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配对象Macth Object具有group方法,我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

group(num=0)
匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()
返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

示例1:

# 导入re模块import re# 使用match方法进行匹配操作result = re.match(正则表达式,要匹配的字符串)# 如果上一步匹配到数据的话,可以使用group方法来提取数据result.group()

示例2:

import reret = re.match("taobao","taobao.com")print(ret)print(ret.group())

运行结果:

<_sre.SRE_Match object; span=(0, 6), match='taobao'>taobao

3. 表示字符

正则表达式的单字符匹配:
这里写图片描述

匹配中文字符的正则表达式: [\u4e00-\u9fa5]

示例1:‘.’
匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
这里写图片描述

示例2:’[ ]‘
用来表示一组字符,单独列出:[amk] 匹配 ‘a’,’m’或’k’
这里写图片描述

示例3:’\d, \D, \s, \S‘
 \d – 匹配一个数字字符。等价于 [0-9]。
 \D –匹配一个非数字字符。等价于 [^0-9]。
 \s –匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
 \S –匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
这里写图片描述

示例4:’\w, \W‘
 \w –匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
 \W 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。
这里写图片描述

4. 原始字符串

示例:
这里写图片描述

Python中字符串前面加上 r 表示原生字符串

与大多数编程语言相同,正则表达式里使用”\”作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符”\”,那么使用编程语言表示的正则表达式里将需要4个反斜杠”\”:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。

Python里的原生字符串很好地解决了这个问题,有了原始字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

5. 表示数量

匹配多个字符的相关格式
这里写图片描述

示例1:’*‘
匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。
这里写图片描述

示例2:’+‘
匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。
这里写图片描述

示例3:’?‘
匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
这里写图片描述

示例4:’{}‘
{n} – n 是一个非负整数。匹配确定的 n 次。
{n,} – n 是一个非负整数。至少匹配n 次。
{n,m} – n m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
这里写图片描述

示例5:匹配出163的邮箱地址,且@符号之前有4到20位,例如‘hello@163.com
这里写图片描述

6. 表示边界

这里写图片描述

示例1:’$’
匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。
这里写图片描述

示例2:’\b’
匹配一个字边界,即字与空格间的位置。
这里写图片描述

示例3:’\B’
非字边界匹配。
这里写图片描述

7. 匹配分组

这里写图片描述

示例1:’|’
指明两项之间的一个选择。要匹配 |,请使用 |。
这里写图片描述
这里写图片描述

示例2:’()’
标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
这里写图片描述

示例3:’\’
将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\’ 匹配 “\”,而 ‘(’ 则匹配 “(“。
这里写图片描述

示例4:’\number’
这里写图片描述

示例5:’(?P)’ ’ (?P=name)’
这里写图片描述
注意:
(?P)和(?P=name)中的字母p大写

8. re模块的高级用法

8.1 seach

这里写图片描述

8.2 findall

这里写图片描述

8.3 sub–将匹配到的数据进行替换

示例1:
这里写图片描述

示例2:

import redef add(temp):    strNum = temp.group()    num = int(strNum) + 1    return str(num)ret = re.sub(r"\d+", add, "python = 997 java=100")print(ret)ret = re.sub(r"\d+", add, "python = 99")print(ret)

运行结果:
这里写图片描述

示例3:从下面的字符串中取出文本

<div>        <p>岗位职责:</p><p>完成推荐算法、数据统计、接口、后台等服务器端相关工作</p><p><br></p><p>必备要求:</p><p>良好的自我驱动力和职业素养,工作积极主动、结果导向</p><p>&nbsp;<br></p><p>技术要求:</p><p>1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式</p><p>2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架</p><p>3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种<br></p><p>4、掌握NoSQL、MQ,熟练使用对应技术解决方案</p><p>5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js</p><p>&nbsp;<br></p><p>加分项:</p><p>大数据,数理统计,机器学习,sklearn,高性能,大并发。</p>        </div>

参考代码:

re.sub(r'</?\w*>|\n|\s','',s)

8.4 spilt

根据匹配进行切割字符串,并返回一个列表
这里写图片描述

9. 贪婪与非贪婪

Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;
非贪婪则相反,总是尝试匹配尽可能少的字符。
在”*”,”?”,”+”,”{m,n}”后面加上?,使贪婪变成非贪婪。
这里写图片描述

正则表达式模式中使用到通配字,那它在从左到右的顺序求值时,会尽量“抓取”满足匹配最长字符串,在我们上面的例子里面,“.+”会从字符串的启始处抓取满足模式的最长字符,其中包括我们想得到的第一个整型字段的中的大部分,“\d+”只需一位字符就可以匹配,所以它匹配了数字“4”,而“.+”则匹配了从字符串起始到这个第一位数字4之前的所有字符。

解决方式:非贪婪操作符“?”,这个操作符可以用在”*”,”+”,”?”的后面,要求正则匹配的越少越好。
这里写图片描述

10. 示例

示例1:匹配网址

http://www.interoem.com/messageinfo.asp?id=35http://3995503.com/class/class09/news_show.asp?id=14http://lib.wzmc.edu.cn/news/onews.asp?id=769http://www.zy-ls.com/alfx.asp?newsid=377&id=6http://www.fincm.com/newslist.asp?id=415

参考代码:

re.match(r'http.+\.[a-z]{2,3}/',str)re.match(r'http://.*?/',str)re.sub(r'(http://.*?/).*',lambda x:x.group(1),str)

输出结果:

http://www.interoem.com/http://3995503.com/http://lib.wzmc.edu.cn/http://www.zy-ls.com/http://www.fincm.com/

示例2:找出单词
查找’hello world ha ha’中所有的单词

re.split(r' +',’ hello world ha ha’)re.findall(r' \b\w+\b',’ hello world ha ha’)
原创粉丝点击