正表达式就是一段匹配文本片段的模式,在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. WOL远程开机

    最近在一直都在研究PC机硬件和软件相结合的软件,硬件信息都是通过C++与驱动结合获取.对于一个好久都没有接触C++的人来说看这些东西太费劲了,必须的重新捡一下C++的基础知识,必然也少不了C知识,底层 ...

  2. Win10下E3-1231 V3开启Intel虚拟化技术(vt-x)安装HAXM

    硬件配置: 技嘉G1 Sniper B6主板,Intel Xeon E3-1231 V3 CPU.主板和U都支持Intel的虚拟化技术,也在主板的设置界面打开了虚拟化支持,如下图: 使用CPU-V检测 ...

  3. [原] JsTree.js

    写自用软件系统时查找到的树列表控件过于庸余,样式难调,故自写一套完整的简易js_TreeTable控件,使用时简单的添加自定义的样式效果即可,特此发布第一个版本. 源码如下: /* * Huashan ...

  4. 算法 - 求两个自然数的最小公倍数(C++)

    //************************************************************************************************** ...

  5. Spring3系列9- Spring AOP——Advice

    Spring3系列9- Spring AOP——Advice Spring AOP即Aspect-oriented programming,面向切面编程,是作为面向对象编程的一种补充,专门用于处理系统 ...

  6. 阿里云centos试用

    今天体验了下阿里云的centos,起初用的官方推荐的putty方式来管理,全部使用命令行管理起来还是很别扭的. 后来通过百度了解到winscp,有了这个工具,管理起来就爽很多啦.整个centos的管理 ...

  7. 配置算法(第4版)的Java编译环境

    1. 下载 1.1 JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html选择“Windows x64 180.5 ...

  8. Qt 添加资源文件

    *本人乃小白,博文主要用于个人记录,不保证内容准确无误* 我们编写的gui可能需要一些额外的资源(比如贴图用的图片),可用资源文件统一管理.以下以图片为例. 用qt creator 打开工程,为工程新 ...

  9. Cannot find SS.INI file for user *** 解决方法

    昨天还用的好好的VSS今天早上一来就提示: Cannot find SS.INI file for user *** 度娘了一下,好像都是说的: 1,vss\users\***\  下无文件SS.IN ...

  10. AssetBundle系列——打包前进行平台检测

    在生成AssetBundle的时候,如果目标平台和当前平台不一致,Unity3D会自动将当前平台转换为目标平台. 如果项目中资源量比较大,这个转换过程是相当漫长的,并且不能够强行中止. 所以最好在Bu ...