正表达式就是一段匹配文本片段的模式,在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. atom 安装插件出现 EIO 错误

    今天给 atom 安装一个插件autocomplete-python的时候出现错误 npm ERR! Windows_NT 6.1.7600 npm ERR! argv "C:\\Progr ...

  2. Photoshop CS6 for Mac简体中文正式 完美破解版 支持Retina屏

    Photoshop CS6 MAC 中文版破解版 支持Retina屏 目前世界上“最好的化妆品”是一款叫做PhotoShop的产品,它可以帮你去除所有你不满意的地方.上周末,这款最好的化妆品推出了第十 ...

  3. win10初体验,我的错误代码哪里去了

    今天闲着,就把WIN7升级安装成WIN10,感觉这次WIN10的升级方案确实还可以人,可以保留文件和配置升级. 升级完,试了一下宽带连接,发现错误代码没了,像下面的应该就691呢~~~

  4. Eclipse无法启动报An internal error occurred during: "reload maven project". java.lang.NullPointerException

    由于没有正常关机导致eclipse无法将数据正常写入配置文件导致无法启动.报这样一个异常 An internal error occurred during: "reload maven p ...

  5. Oracle 数据库表同步方法浅议

    总结一下Oracle数据库表级别的复制同步 一.通过触发器进行表的复制 原理,是监听表上都某一字段进行的DML操作,然后得到DML操作的数据,重新在另一个表上执行DML操作. 优点: 简单,编写一个触 ...

  6. Flink 剖析

    1.概述 在如今数据爆炸的时代,企业的数据量与日俱增,大数据产品层出不穷.今天给大家分享一款产品—— Apache Flink,目前,已是 Apache 顶级项目之一.那么,接下来,笔者为大家介绍Fl ...

  7. Spark源码系列(九)Spark SQL初体验之解析过程详解

    好久没更新博客了,之前学了一些R语言和机器学习的内容,做了一些笔记,之后也会放到博客上面来给大家共享.一个月前就打算更新Spark Sql的内容了,因为一些别的事情耽误了,今天就简单写点,Spark1 ...

  8. 哈夫曼算法(haffman)实现压缩和解压缩-C语言实现

    /* * ===================================================================================== * * Filen ...

  9. 多线程调用WebClient速度变慢的问题

    设置 System.Net.ServicePoint 对象所允许的最大并发连接数 System.Net.ServicePoint 对象允许的最大并发连接数.默认值为 2 System.Net.Serv ...

  10. Android之线程回掉更新ui

    一:工作线程中的回掉更新UI public class MainActivity extends AppCompatActivity { private int i; private Callback ...