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

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. MSF——Meterpreter(三)

    MSF系列: MSF——基本使用和Exploit模块(一) MSF——Payload模块(二) MSF——Meterpreter(三) MSF——信息收集(四) 一.简介 Meterpreter是Me ...

  2. Dubbo 系列(07-4)集群容错 - 集群

    BDubbo 系列(07-4)集群容错 - 集群 [toc] Spring Cloud Alibaba 系列目录 - Dubbo 篇 1. 背景介绍 相关文档推荐: Dubbo 集群容错 - 实战 D ...

  3. 如何访问 Redis 中的海量数据,服务才不会挂掉?

    来源:www.toutiao.com/i6697540366528152077 一.前言 有时候我们需要知道线上的Redis的使用情况,尤其需要知道一些前缀的key值,让我们怎么去查看呢?并且通常情况 ...

  4. ubuntu 配置php环境

    第一步:先更新 sudo apt-get update 第二步:安装 安装 Apache2: sudo apt-get install apache2 安装PHP模块: sudo apt-get in ...

  5. Java原理领悟-线程池(Executor)

    线程池全面解析 什么是线程池? 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复用. 线程池的好处 我 ...

  6. 用户积分排行榜功能-Redis实现

    一.排行榜功能简介 排行榜功能是一个很普遍的需求.使用 Redis 中有序集合(SortedSet)的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如交通数据流中的路口/路段的车流量 ...

  7. atcoder 泛做

    https://atcoder.jp/contests/arc060/tasks/arc060_b 先考虑一些特殊情况: $$n>s$$ $$n=s$$ $b$小于$sqrt(N)$可以枚举,如 ...

  8. nmap使用笔记

    扫描全端口判断服务 nmap ip -T4 -Pn -sV -p 1-65535 扫描端口并且标记可以爆破的服务 nmap ip --script=ftp-brute,imap-brute,smtp- ...

  9. Android processDebugManifest 异常

    1.使用 gradlew processDebugManifest --stacktrace 进行排查; 2.异常: processDebugManifest (Thread[Execution wo ...

  10. 【leetcode】924.Minimize Malware Spread

    题目如下: In a network of nodes, each node i is directly connected to another node j if and only if grap ...