正表达式就是一段匹配文本片段的模式,在Python 中 re 模块包含了对正则表达式(regular expression)的支持。

1. 正则表达式的基本概念

1. 通配符

点号( . )可以匹配换行符之外的任何单个字符,被称之为通配符

2. 特殊字符转义

将有特殊含义的字符作为普通字符使用时需要进行转义。例如想要匹配 python.org时需要将表达式写为: python\\.org 才行。

为什么使用两个反斜线?

这是为了通过解释器进行转义,需要进行两个级别的转义:1.通过解释器的转义;2.通过 re 模块转义。如果不想使用两个反斜线,可以考虑使用原始字符串,如:r'python\.org'

3. 字符集

字符集是在中括号( [] )中包含字符串。字符集可以匹配它所包含的任意字符。即'[pj]ython'可以匹配 pythonjython

使用范围

可以使用范围,如 '[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 Doc —— re 模块

Python基础教程(第二版)

【循序渐进学Python】12.Python 正则表达式简介的更多相关文章

  1. Python中正则表达式简介

    目录 一.什么是正则表达式 二.正则表达式的基础知识 1. 原子 1)普通字符作为原子 2)非打印字符作为原子 3) 通用字符作为原子 4) 原子表 2. 元字符 1)任意匹配元字符 2)边界限制元字 ...

  2. Python re 正则表达式简介

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

  3. 【循序渐进学Python】5.Python常用流程控制及其他语句

    1. 赋值语句常用技巧 通过序列解包(sequence unpacking)可以将多个值的序列解开,让后一一放置到变量的序列中.解包的序列中的元素必须和等号左边变量数量一致.如下: values = ...

  4. 【循序渐进学Python】2. Python中的序列——列表和元组

    序列概览 在Python中有六种内建的序列:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.在这里暂时只讨论列表和元组.列表和元组的主要区别在于:列表可以修改,元组(不可 ...

  5. Python::re 模块 -- 在Python中使用正则表达式

    前言 这篇文章,并不是对正则表达式的介绍,而是对Python中如何结合re模块使用正则表达式的介绍.文章的侧重点是如何使用re模块在Python语言中使用正则表达式,对于Python表达式的语法和详细 ...

  6. Python系列之正则表达式详解

    Python 正则表达式模块 (re) 简介 Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作,和 Perl 脚本的正则表达式功能类似,使用 ...

  7. 【Python】Python正则表达式使用指导

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

  8. Python 各种测试框架简介(三):nose

    转载:https://blog.csdn.net/qq_15013233/article/details/52527260 摘要 这里将从(pythontesting.net)陆续编译四篇 Pytho ...

  9. python基础知识1——简介与入门

    什么是Python:Python能做什么:安装与更新:第一个Python程序:变量:pyc字节码:编码:条件和循环:Python运算符:算数,比较,赋值,位,逻辑::::::::::::::::::: ...

随机推荐

  1. 百度Web富文本编辑器ueditor在ASP.NET MVC3项目中的使用说明

    ====================================================================== [百度Web富文本编辑器ueditor在ASP.NET M ...

  2. 【css】a:hover 设置上下边框在 ie6 和 ie7 下失效

    前段时间在写样式的时候发现了这个问题,虽然当时就解决了这个 bug 不过还是记录下,以免再次出现这样的问题. demo 代码: <!doctype html> <html lang= ...

  3. Ehcache 使用

    自从Ehcache 到了1.2+的版本,就支持分布式缓存了 Spring + Hibernate的结构 ,ehcache的对这几个框架的支持较好,就采用这个缓存方案 下面是配置文件: <ehca ...

  4. struts2:JSP页面及Action中获取HTTP参数(parameter)的几种方式

    本文演示了JSP中获取HTTP参数的几种方式,还有action中获取HTTP参数的几种方式. 1. 创建JSP页面(testParam.jsp) <%@ page language=" ...

  5. iOS:基于AVPlayer实现的视频播放器

    最近在学习AVFoundation框架的相关知识,写了一个基于AVPlayer的视频播放器,相关功能如下图: 代码github:https://github.com/wzpziyi1/VideoPla ...

  6. 在线PDF编辑网站http://www.pdfescape.com

    网站地址:http://www.pdfescape.com 先转载一个简单介绍的文章 如果你以前很少阅读PDF文档,电脑中也没有PDF阅读器:adobe reader,foxit reader之类的软 ...

  7. Selenium关键字驱动测试框架Demo(Java版)

    Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html

  8. FastSocket.Net

    Overview FastSocket是一个轻量级易扩展的c#异步socket通信库,项目开始于2011年,经过近3年不断调整与改进,目前在功能和性能上均有不错的表现. 项目地址:https://gi ...

  9. system 函数

    相关函数:fork, execve, waitpid, popen 头文件:#include <stdlib.h> 定义函数:int system(const char * string) ...

  10. 顺序图(Sequence Diagram)

    顺序图(Sequence Diagram)对系统的动态方面来建模. 顺序图是强调消息时间顺序的交互图. 协作图则是强调接收和发送消息的对象的结构组织的交互图 如何对动态方面建模?  所谓动态文面,即 ...