在处理字符串时,经常会有查找符合某些规则的字符串的需求。正则表达式就是用于藐视这些规则的工具。换句话说,正则表达式是记录文本规则的代码。

1、行定位符。

  行定位符就是用来表示字符串的边界,“^”表示开始,“$”表示行的结尾。例

^sjc
sjc$

  ^jsc表示匹配以 sjc开始的字符串,sjc$匹配以htm结尾的字符串,如果想2个都匹配的话直接 输入jsc即可。

2、元字符

  正则表达式还右很多元字符,例如下面的正则表达式中应用了"\b"和“\w”。

\bmr\w*\b

  上面的正则表达式用于匹配字母mr开头的单词,先从某个单词的开始出(\b),然后匹配字母mr,接着是匹配任意数字的字母或者数字(\w*),最后单词结尾处(\b).表达式可以匹配 mrsoft,mr124,等,但是不能匹配cbmr。常用的元字符表如下所示。

代码 说明 举例
. 匹配除了换行符以外的任意字符

.可以匹配\mr\nM\tR中的m、r、M、\t、R

\w 匹配字母、数字、下划线或者汉字 \w可以匹配"m中7r\n"中的“m、中、7、r”,但是不能匹配\n
\W 匹配除了字母、数字、下划线或者汉字以外的字符 \W可以匹配“\n,但是不能匹配“m,中,7,r”
\s 匹配单个的空白字符(包含tab键和换行符) 可以匹配mr\tMR中的\t
\S 除了空白符以外的所有字符

可以匹配mr\tMR中的m、r、M、R

\b 匹配单词的开始或者结束,单词的分界符通常是空格,表单符号或者换行 在“i like mr or am”字符串中,\bm与mr中的m相匹配,不和am匹配
\d 匹配数字 \d可以与m7ri中的字符7匹配

3、限定符

  在上面的例子中,使用(\w*)匹配任意数量的字母或者数字,如果想匹配特定数量的数字,该如何表示?正则表达式提供了限定符(指定数量的字符)来实现该功能。如果匹配9位的QQ号可以用以下表达式:

^\d{9}$

常用的限定符如下

限定符 说明 举例
匹配前面的字符0次或者1次 colou?r,该表达式可以匹配colour和color
+ 匹配前面的字符一次或多次 go+gle,该表达式可以匹配的范围从gogle到goo***gle
* 匹配前面的字符0次或者多次 go*gle该表达式可以匹配的范围从ggle到goo***gle
{n} 匹配前面的字符n次 go{2}gle,该表达式只能匹配到google
{n,} 匹配前面的字符最少n次 go{2,}gle,该表达式可以匹配的范围从google到goo***gle
{n,m} 匹配前面的字符最少n次,最多m 次 employe{0,2}该表达式可以匹配employ,employe和employee3种情况

4、字符类

  正则表达式查找数字和字母很简单,因为已经有了对应这些字符集合的元字符,但是如果只要匹配没有预定义元字符的字符集合比如(a,c,i,o,u)呢?

  只需要在方括号里面列出他们即可,像[aciou]可以匹配到这些字母,[.?!]匹配标点符号(“,”“?”或者“!”),也可以轻松地指定一个字符范围,向“【0-9】”代表的含义与“\d”就是完全一致的;

备注:想要匹配给定字符串中任意一个汉字可以使用“[\u4e00-\u9fa5]”,如果要匹配连续多个汉字,可以使用“[\u4e00-\u9fa5]+”

5、排除字符

  匹配不符合指定字符集的字符串正则表达式提出了“^”字符。在【1】的时候我们用这个符号表示,在行的开始,但是如果把它放到[ ]中的话,表示非,排除的意思,比如

[^a-zA-Z]#该表达式用于匹配一个不是字母的字符。

6、选择字符

  试想一下,如果匹配身份证号码?身份证号长度是15位或者18位,15位时,全为数字,如果为18位时,前17位位数字,最后一位是校验位,可以为数字或者字符X。

  上面的描述中,包含着条件的逻辑,这就需要用选择字符(|)来实现该字符可以理解为“或”,匹配身份证号码的正则表达式可以写到一下方式:

(^\d{15}$)|(^\d{18}$)|(^\d{17}x$)(\d|X|x)$
#以数字开头的15位数字
#以数字开头的18位数字
#以数字开头的17位数字,后一位可以为数字,X或x

7、转义字符

  正则表达式中的转义字符(\)和python中大同小异,都是将特殊字符【. ? \ 等】变成一个普通的字符。\? 代表转义了?

备注:如果要讲匹配字母m开头的单词的正则表达式转换为模式字符串,则不能直接在两侧添加引号定界符。如

‘\bm\w*\b’#不正确
“\\bm\\w*\\b”#必须把\进行转义
如果包含大量的特殊字符和反斜杠。可以用R或r.
r'\bm\w*\b'

8、分组

  小括号()字符第一个作用就是可以改变限定符的作用范围   例如1。第二个作用就是分组,也就是子表达式,如(\.[0-9]{1,3}){3})就是对分组(\.[0-9]{1,3})进行重复操作

(six|four)th
#如果不用小括号的话,就会匹配six ,和 fourth

二、利用re模块实现正则表达式操作 

  python提供了re模块,用于实现正则表达式的操作,在实现时,可以利用re模块提供的方法如(search(),match(),findall()等)进行字符串处理,也可以先使用re模块的compile()方法将模式字符串转换为正则表达式对象,然后再使用正则表达式对象的相关方法来操作字符串。

  re模块的使用时,需要先应用import语句 引入。

improt re

1、使用match()方法进行匹配

  match()方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回match对象,否则返回None。具体羽凡格式如下: 

re.match(pattern,string,[flages])

参数说明:

pattern:表示模式字符串,由要匹配的正则表达式转换而来

string:表示要匹配的字符串

flags:可选参数,表示标志位,用于控制匹配房型,常用的标志如图所示

标志 说明
A 对于\w、\W、\b、\B、\d、\D、\s、\S只进行ASCII匹配
I 只想不区分字母大小写的匹配
M 将^和$用于包括整个字符串的开始和结尾的每一行
S 使用(.)字符匹配所有字符,包括换行符
X 忽略模式字符串中未转义和注释

例如,匹配字符串是否以“mr_”开头,不区分大小写,代码如下

import re
pattern = r'mr_\w+'# 模式字符串
string = 'MR_SHOP mr_shop' #要匹配的字符串
match = re.match(pattern,string,re.I)#匹配字符串,不区分大小写
print(match)
#输出<re.Match object; span=(0, 7), match='MR_SHOP'>
string = '项目名称MR_SHOP mr_shop'
match = re.match(pattern,string,re.I)
print(match)
#输出None

从上面可以看出,match()方法从字符串的开始位置开始匹配,当第一个字母不符合条件时,则不进行匹配,直接返回None

  match对象中包含了匹配值的位置可以使用的end()方法:通过span()方法可以返回匹配位置的远足;通过string属性可以获取要匹配的字符串。例如

import re
pattern = r'mr_\w+'#
string = 'MR_SHOP mr_shop'
match = re.match(pattern,string,re.I)
print(match.start())#匹配值的起始位置 0
print(match.end())#匹配值得结束位置7
print(match.span())#匹配位置的元组(0,7)
print(match.string)#匹配的字符串(MR_SHOP mr_shop)
print(match.group())#匹配的数据(MR_SHOP)

①实例1 验证输入的手机号码是否为中国移动号码?

import re
while True:
mobile= input("请输入手机号码,退出请输入q")
pattern = r'(13[4-9]\d{8})$|(15[01289]\d{8})$'
#匹配模式
match = re.match(pattern,mobile)#进行匹配
if match == None:
print(mobile,'不是有效的移动手机号')
else:
print(mobile,'是有效的手机号码')

2、进行search()进行匹配

  search()方法用于整个字符串中搜索第一个匹配的值如果在起始位置匹配成功,则返回match对象,否则返回None,search()方法的语法格式如下:

import re
pattern = r'mr_\w+' #模式字符串
string = 'MR_SHOP mr_shop'
match = re.search(pattern,string,re.I)#
#搜索字符串,不区分大小写
print(match)
string = "项目名称MR_Shop mr_shop"
match = re.search(pattern,string,re.I)
print(match)
#输出<re.Match object; span=(0, 7), match='MR_SHOP'>
#<re.Match object; span=(4, 11), match='MR_Shop'>

3、使用findall()方法进行匹配

  findall() 方法用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。如果匹配成功,则返回包含匹配结构的列表,否则返回空列表。  

import re
pattern = r'mr_\w+' #模式字符串
string = 'MR_SHOP mr_shop'
match = re.findall(pattern,string,re.I)#
#搜索字符串,不区分大小写
print(match)
string = "项目名称MR_SHOP mr_shop"
match = re.findall(pattern,string,re.I)
print(match)
#输出['MR_SHOP', 'mr_shop']
#['MR_SHOP', 'mr_shop']

如果在指定的模式字符串中,包含分组,则返回与分组匹配的文本列表。例

import re
pattern = r'[1-9]{1,3}(\.[0-9]{1,3}){3}'#模式字符串
string = '127.0.0.1 192.168.1.55'
match = re.findall(pattern,string)
print(match)#输出['.1', '.55']

  从上面的结果可以看出,并没有得到匹配的IP地址,这是因为在模式字符串中出现了分组,所以得到的结果是根据分株进行匹配的结果,既“(\.[0-9]{1,3})”匹配的结果,如果想获取整个模式字符串的匹配,可以将整个模式字符串使用一对小括号进行分组,然后再获取结果时,只取返回值列表的每个元素(是一个元组)的第一个元素,代码如下:

import re
pattern = r'([1-9]{1,3}(\.[0-9]{1,3}){3})'#模式字符串
#1-9的数字,随机出现1至3次,然后是, .1到9的数字,出现1至3次,共匹配3次。
#这里只是做个例子,不是准确的IP地址匹配。
string = '127.0.0.1 192.168.1.55'
match = re.findall(pattern,string)#[('127.0.0.1', '.1'), ('192.168.1.55', '.55')]
for item in match:
print(item[0])
#输出127.0.0.1
#192.168.1.55

4、替换字符串

  sub()方法用于实现字符串替换,语法格式如下

re.sub(pattern,repl,string,count,flags)

  参数说明:

  pattern:表示模式字符串,由要匹配的正则表达式转换而来。

  repl:表示替换的字符串

   string:表示要被查找替换的原始字符串

  count:可选参数,表示模式匹配后替换的最大次数,默认为0,表示替换所有的匹配

  flags:可选参数,表示标志位,用于控制匹配方式,如是否区分大小写,常用标志位I表示。

   例如,隐藏中奖信息的手机号码,代码如下:  

import  re
pattern = r'1[34578]\d(9)'#定义要替换的模式字符串
string = '中奖号码为:84978981,联系电话为:13688888888'
result = re.sub(pattern,"",string)#替换字符串
print(result)
#输出:中奖号码为:84978981,电话为:13666666666

5、使用正则分隔字符串

  split()方法用于实现根据正则表达式分隔字符串,并以列表的形式返回。其作用同字符串对象的split()方法类似,所不同的就是分隔字符由模式字符串指定。语法如下

re.split(pattern,string,[maxsplit],[flags])

参数说明:

pattern:表示模式字符串,由要匹配的正则表达式转换而来

string:表示要匹配的字符串。

maxsplit:可选参数,表示最大的拆分次数

flags:不说了,自己看前面的解释 ,标志位

例如:被定为的URL地址中提取出请求地址和各个参数,代码如下:

import re
pattern = r'[?|&]'#定义分隔符,以?或&分隔
url = 'http://www.baidu.com/login.jsp?username="mr"&pwd="123456"'
result = re.split(pattern,url)
print(result)
#输出['http://www.baidu.com/login.jsp', 'username="mr"', 'pwd="123456"']

python之正则表达式【re】的更多相关文章

  1. [python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】

    [python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pytho ...

  2. Python 进阶 - 正则表达式

    1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...

  3. python study - 正则表达式

    第 7 章 正则表达式 7.1. 概览 7.2. 个案研究:街道地址 7.3. 个案研究:罗马字母 7.3.1. 校验千位数 7.3.2. 校验百位数 7.4. 使用 {n,m} 语法 7.4.1. ...

  4. python使用正则表达式文本替换

    2D客户端编程从某种意义上来讲就是素材组织,所以,图片素材组织经常需要批量处理,python一定是最佳选择,不管是win/linux/mac都有一个简单的运行环境 举两个应用场景: 如果不是在某个文件 ...

  5. python的正则表达式 re

    python的正则表达式 re 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这点不用担心,python会处理地和Ascii字符一 ...

  6. Python之正则表达式(re模块)

    本节内容 re模块介绍 使用re模块的步骤 re模块简单应用示例 关于匹配对象的说明 说说正则表达式字符串前的r前缀 re模块综合应用实例 正则表达式(Regluar Expressions)又称规则 ...

  7. Python:正则表达式详解

    正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能 ...

  8. 【Python】正则表达式纯代码极简教程

    <Python3正则表达式>文字版详细教程链接:https://www.cnblogs.com/leejack/p/9189796.html ''' 内容:Python3正则表达式 日期: ...

  9. 【Python】正则表达式简单教程

    说明:本文主要是根据廖雪峰网站的正则表达式教程学习,并根据需要做了少许修改,此处记录下来以备后续查看. <Python正则表达式纯代码极简教程>链接:https://www.cnblogs ...

  10. 【转】Python之正则表达式(re模块)

    [转]Python之正则表达式(re模块) 本节内容 re模块介绍 使用re模块的步骤 re模块简单应用示例 关于匹配对象的说明 说说正则表达式字符串前的r前缀 re模块综合应用实例 参考文档 提示: ...

随机推荐

  1. UVA10271_Chopsticks

    Chopsticks 大致就是有一堆筷子,知道了他们的长度,现在选长度为abc的三个筷子a<=b<=c为一对筷子,质量为(a-b)平方,现在选k双这样的筷子,求质量最小 思路: 第一次看到 ...

  2. 再往DjVu鼓吹者的头上敲一棒子

    最近在某论坛又看到有人在鼓吹DjVu,甚至声称拿到PDG就转成DjVu,忍不住想再敲打敲打. 早几年前就已经有人举出过实例,证明PDG.TIFF转DjVu会因为有损压缩而产生错别字,似乎时间长了一堆新 ...

  3. python小学堂-基础调用

    tem='xiaoq {0}iang'print(tem.capitalize())#首字母大学print(tem.center(30)) #居中显示iprint(tem.endswith(" ...

  4. HDU 1577 WisKey的眼神

    WisKey的眼神 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. POJ 2112 /// 最大流+floyd+二分

    题目大意: 有 k台挤奶机 和 c头奶牛 每台挤奶机最多为m头奶牛服务 给定所有挤奶机和奶牛两两之间的距离 求一种分配 使得 奶牛与挤奶机之间的最远距离 最小化 floyd求得所有挤奶机与奶牛两两之间 ...

  6. Java技术中的三大特性

    1.虚拟机                                Java虚拟机JVM(Java Virtual Machine)在Java编程里面具有非常重要的地位,约相当于前面学到的Jav ...

  7. C常量与变量

    /** * C中的常量与变量 * 常量的值在程序中是不可变化的,其在定义时必须给一个初始值 * 常量的定义方式: * 1.#define 定义宏常量 * 2.const 定义const常量 * 对于# ...

  8. react学习笔记_03-组件&props

    组件 & Props的学习 组件允许你将 UI 拆分为独立可复用的代码片段,并对每个片段进行独立构思. 组件,从概念上类似于 JavaScript 函数.它接受任意的入参(即 “props”) ...

  9. services - Internet 网络服务列表

    DESCRIPTION(描述) services 是一个普通的 ASCII 码文件, 它在 internet 服务的友好原文名以及这些服务预先分配的端口和协议类型之间提供了映射. 每个联网程序必须查找 ...

  10. 第8篇NFS PersistentVolume

    一.部署nfs服务端: k8s-master 节点上搭建了 NFS 服务器,也可以在部署节点搭建,原理一样 (1)安装nfs服务: yum install -y nfs-utils rpcbind v ...