【循序渐进学Python】12.Python 正则表达式简介
正表达式就是一段匹配文本片段的模式,在Python 中 re
模块包含了对正则表达式(regular expression)的支持。
1. 正则表达式的基本概念
1. 通配符
点号( .
)可以匹配换行符之外的任何单个字符,被称之为通配符。
2. 特殊字符转义
将有特殊含义的字符作为普通字符使用时需要进行转义。例如想要匹配 python.org
时需要将表达式写为: python\\.org
才行。
为什么使用两个反斜线?
这是为了通过解释器进行转义,需要进行两个级别的转义:1.通过解释器的转义;2.通过 re 模块转义。如果不想使用两个反斜线,可以考虑使用原始字符串,如:
r'python\.org'
。
3. 字符集
字符集是在中括号( []
)中包含字符串。字符集可以匹配它所包含的任意字符。即'[pj]ython'
可以匹配 python
和 jython
。
使用范围
可以使用范围,如
'[a-z]'
可以匹配 a 到 z 的任意一个字符。'a-zA-Z0-9'
可以匹配任意大小写的一个字母或数字。
反转字符集
我们也可以对字符集进行反转,比如
'[^abc]'
匹配除了a、b和c之外的任何字符。
字符集中的特殊字符
特殊字符在模式中做文本字符,而不是正则表达式运算符的话需要对其进行转义。但是在字符集中并不需要,只有以三种情况下,需要将特殊字符作为普通文本使用时,需要对字符进行转义:
^
脱字符作为字符集的开头]
右中括号作为字符集的开头-
横线(字符范围)作为字符集的开头
4. 选择符合子模式
管道符号( |
)是用于选择项的特殊字符。例如: 'python|ruby'
匹配python和ruby这两个单词。
子模式(subparttern)是指:使用圆括号将选择项括起来。例如 'p(ython|erl)'
匹配python和perl。
5. 可选项和重复子模式
在子模式后面加上一个问号,它就变成了一个可选项,例如:
r'(http://)?(www\.)?python\.org$'
上面的模式只能匹配下面的字符串:
'http://www.python.org'
'http://python.org'
'www.python.org'
'python.org'
问号表示子模式可以出现一次或者根本不出现,下面的运算符允许子模式重复多次:
- (pattern)*: 允许模式重复0次或多次
- (pattern)+: 允许模式出现一次或多次
- (pattern){m-n}: 允许模式重复m~n次
6. 字符串的开始和结尾
使用 ^
脱字符标记字符串开始;使用美元符号 $
标识字符串的结尾。如:
'^Python$'
2. re 模块
re 模块包含了很多操作正则表达式的函数,以下是其中最常用的函数:
compile(pattern[, flags]) 根据包含正则表达式的字符串创建模式对象
search(pattern, string[, flags]) 在字符串中寻找模式
match(pattern, string[, flags]) 在字符串的开始处匹配模式
split(pattern, string[, maxsplit=0]) 根据模式的匹配项来分割字符串
findall(pattern, string) 列出字符串中模式的所有匹配项
sub(pat, repl, string[, count=0]) 将字符串中所有pat的匹配项用repl替换
escape(string) 将字符串中所有特殊正则表达式字符转义
下面是这些函数的的简单示例:
# --coding: utf-8 --
import re # search
pattern = r'(http://)?(www\.)?python\.org$'
string = 'python.org'
if re.search(pattern,string):
print 'found it' # match
text = 'alpha,beta,,,,,,gamma delta'
pattern = '[,]+' # 注意+号
print re.split(pattern,text) # ['alpha', 'beta', 'gamma delta'] # findall
pattern = '[a-zA-Z]+' # 匹配单词
text = '"Hm... Err -- are you sure?" he said, sounding insecure.'
# ['Hm', 'Err', 'are', 'you', 'sure', 'he', 'said', 'sounding', 'insecure']
print re.findall(pattern,text) pattern = r'[.?\-",]' # 匹配标点符号
# ['"', '.', '.', '.', '-', '-', '?', '"', ',', '.']
print re.findall(pattern,text) # sub
pattern = '{name}'
text = 'Dear {name}...'
print re.sub(pattern, 'Mr. Gumby', text) # Dear Mr. Gumby... # escape
print re.escape('www.python.org') # www\.python\.org
print re.escape('But where is the ambiguity?') # But\ where\ is\ the\ ambiguity\?
2.1 匹配对象和组
当 re
模块中对字符串进行匹配的函数找到匹配项时,就会返回一个 MatchObject
对象。
组的概念
该对象包含了匹配模式的子字符串的信息,这些信息由组(group)构成。简而言之,组就是放置在圆括号内的子模式。组的序号取决于它左侧的括号数。组0就是整个模式。在下面的模式中:
'There (was a (wee) (cooper)) who (lived in Fyfe)'
包含这些组:
0 There was a wee cooper who lived in Fyfe
1 was a wee cooper
2 wee
3 cooper
4 lived in Fyfe
下面是 re 匹配对象的常用方法:
group([group1], ...]) 获取给定子模式(组)的匹配项
start([start]) 返回给定组匹配项的开始位置(返回结果是索引从0开始)
end([end]) 返回给定组匹配项的结束位置(返回结果是索引加1,和分片一样,不包括组的结束位置)
span([group]) 返回一个组的开始和结束位置
示例如下:
import re m = re.match(r'www\.(.*)\..{3}','www.python.org')
print m.group(1) # python
print m.start(1) #
print m.end(1) #
print m.span(1) # (4, 10)
除了整体匹配以为(组0),只能使用99个组,即组的范围在1-99之间
2.2 使用re的替换函数
通过使用 re.sub
函数和组号的结合,还可以实现更加复杂的字符串提供功能,如下所示:
import re emphasis_pattern = r'\*([^\*]+)\*' # hello, <em>world</em>!
print re.sub(emphasis_pattern,r'<em>\1</em>','hello, *world*!')
贪婪模式和非贪婪模式
重复运算符默认是贪婪的( greedy
),它会进行尽可能多的匹配。如下面的模式使用的就是贪婪模式:
import re emphasis_pattern = r'\*(.+)\*'
text = '*This* is *it*'
# <em>This* is *it<em>
print re.sub(emphasis_pattern,r'<em>\1<em>',text)
非贪婪模式和贪婪模式相反,它会尽可能少的匹配。将重复运算符变成非贪婪模式只需要在其后加一个问号( ?
)即可:
import re emphasis_pattern = r'\*(.+?)\*'
text = '*This* is *it*'
# <em>This<em> is <em>it<em>
print re.sub(emphasis_pattern,r'<em>\1<em>',text)
参考资料&进一步阅读
【循序渐进学Python】12.Python 正则表达式简介的更多相关文章
- Python中正则表达式简介
目录 一.什么是正则表达式 二.正则表达式的基础知识 1. 原子 1)普通字符作为原子 2)非打印字符作为原子 3) 通用字符作为原子 4) 原子表 2. 元字符 1)任意匹配元字符 2)边界限制元字 ...
- Python re 正则表达式简介
1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...
- 【循序渐进学Python】5.Python常用流程控制及其他语句
1. 赋值语句常用技巧 通过序列解包(sequence unpacking)可以将多个值的序列解开,让后一一放置到变量的序列中.解包的序列中的元素必须和等号左边变量数量一致.如下: values = ...
- 【循序渐进学Python】2. Python中的序列——列表和元组
序列概览 在Python中有六种内建的序列:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.在这里暂时只讨论列表和元组.列表和元组的主要区别在于:列表可以修改,元组(不可 ...
- Python::re 模块 -- 在Python中使用正则表达式
前言 这篇文章,并不是对正则表达式的介绍,而是对Python中如何结合re模块使用正则表达式的介绍.文章的侧重点是如何使用re模块在Python语言中使用正则表达式,对于Python表达式的语法和详细 ...
- Python系列之正则表达式详解
Python 正则表达式模块 (re) 简介 Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作,和 Perl 脚本的正则表达式功能类似,使用 ...
- 【Python】Python正则表达式使用指导
1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...
- Python 各种测试框架简介(三):nose
转载:https://blog.csdn.net/qq_15013233/article/details/52527260 摘要 这里将从(pythontesting.net)陆续编译四篇 Pytho ...
- python基础知识1——简介与入门
什么是Python:Python能做什么:安装与更新:第一个Python程序:变量:pyc字节码:编码:条件和循环:Python运算符:算数,比较,赋值,位,逻辑::::::::::::::::::: ...
随机推荐
- 百度Web富文本编辑器ueditor在ASP.NET MVC3项目中的使用说明
====================================================================== [百度Web富文本编辑器ueditor在ASP.NET M ...
- 【css】a:hover 设置上下边框在 ie6 和 ie7 下失效
前段时间在写样式的时候发现了这个问题,虽然当时就解决了这个 bug 不过还是记录下,以免再次出现这样的问题. demo 代码: <!doctype html> <html lang= ...
- Ehcache 使用
自从Ehcache 到了1.2+的版本,就支持分布式缓存了 Spring + Hibernate的结构 ,ehcache的对这几个框架的支持较好,就采用这个缓存方案 下面是配置文件: <ehca ...
- struts2:JSP页面及Action中获取HTTP参数(parameter)的几种方式
本文演示了JSP中获取HTTP参数的几种方式,还有action中获取HTTP参数的几种方式. 1. 创建JSP页面(testParam.jsp) <%@ page language=" ...
- iOS:基于AVPlayer实现的视频播放器
最近在学习AVFoundation框架的相关知识,写了一个基于AVPlayer的视频播放器,相关功能如下图: 代码github:https://github.com/wzpziyi1/VideoPla ...
- 在线PDF编辑网站http://www.pdfescape.com
网站地址:http://www.pdfescape.com 先转载一个简单介绍的文章 如果你以前很少阅读PDF文档,电脑中也没有PDF阅读器:adobe reader,foxit reader之类的软 ...
- Selenium关键字驱动测试框架Demo(Java版)
Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html
- FastSocket.Net
Overview FastSocket是一个轻量级易扩展的c#异步socket通信库,项目开始于2011年,经过近3年不断调整与改进,目前在功能和性能上均有不错的表现. 项目地址:https://gi ...
- system 函数
相关函数:fork, execve, waitpid, popen 头文件:#include <stdlib.h> 定义函数:int system(const char * string) ...
- 顺序图(Sequence Diagram)
顺序图(Sequence Diagram)对系统的动态方面来建模. 顺序图是强调消息时间顺序的交互图. 协作图则是强调接收和发送消息的对象的结构组织的交互图 如何对动态方面建模? 所谓动态文面,即 ...