re模块(Python中的正则表达式)
re模块
正则表达式本身是一种小型的、高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。
正则表达式中常用的字符含义
1、普通字符和11个元字符:
普通字符 |
匹配自身
|
abc
|
abc
|
.
|
匹配任意除换行符"\n"外的字符(在DOTALL模式中也能匹配换行符 |
a.c
|
abc
|
\
|
转义字符,使后一个字符改变原来的意思
|
a\.c;a\\c
|
a.c;a\c
|
*
|
匹配前一个字符0或多次
|
abc*
|
ab;abccc
|
+
|
匹配前一个字符1次或无限次
|
abc+
|
abc;abccc
|
?
|
匹配一个字符0次或1次
|
abc?
|
ab;abc
|
^
|
匹配字符串开头。在多行模式中匹配每一行的开头 | ^abc |
abc
|
$
|
匹配字符串末尾,在多行模式中匹配每一行的末尾 | abc$ |
abc
|
| | 或。匹配|左右表达式任意一个,从左到右匹配,如果|没有包括在()中,则它的范围是整个正则表达式 |
abc|def
|
abc
def
|
{} | {m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若省略n,则匹配m至无限次 |
ab{1,2}c
|
abc
abbc
|
[]
|
字符集。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。[^abc]表示取反,即非abc。 所有特殊字符在字符集中都失去其原有的特殊含义。用\反斜杠转义恢复特殊字符的特殊含义。 |
a[bcd]e
|
abe
ace
ade
|
()
|
被括起来的表达式将作为分组,从表达式左边开始没遇到一个分组的左括号“(”,编号+1. 分组表达式作为一个整体,可以后接数量词。表达式中的|仅在该组中有效。 |
(abc){2} a(123|456)c |
abcabc
a456c
|
这里需要强调一下反斜杠\的作用:
- 反斜杠后边跟元字符去除特殊功能;(即将特殊字符转义成普通字符)
- 反斜杠后边跟普通字符实现特殊功能;(即预定义字符)
- 引用序号对应的字组所匹配的字符串。
- a=re.search(r'(tina)(fei)haha\2','tinafeihahafei tinafeihahatina').group()
- print(a)
- 结果:
- tinafeihahafei
2、预定义字符集(可以写在字符集[...]中)
\d
|
数字:[0-9] |
a\bc
|
a1c
|
\D
|
非数字:[^\d] |
a\Dc
|
abc
|
\s
|
匹配任何空白字符:[<空格>\t\r\n\f\v] |
a\sc
|
a c
|
\S | 非空白字符:[^\s] |
a\Sc
|
abc
|
\w
|
匹配包括下划线在内的任何字字符:[A-Za-z0-9_] |
a\wc
|
abc
|
\W
|
匹配非字母字符,即匹配特殊字符 |
a\Wc
|
a c
|
\A
|
仅匹配字符串开头,同^ | \Aabc |
abc
|
\Z
|
仅匹配字符串结尾,同$ |
abc\Z
|
abc
|
\b
|
匹配\w和\W之间,即匹配单词边界匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 | \babc\b a\b!bc |
空格abc空格 a!bc |
\B
|
[^\b] |
a\Bbc
|
abc
|

- 这里需要强调一下\b的单词边界的理解:
w = re.findall('\btina','tian tinaaaa')- print(w)
- s = re.findall(r'\btina','tian tinaaaa')
- print(s)
- v = re.findall(r'\btina','tian#tinaaaa')
- print(v)
- a = re.findall(r'\btina\b','tian#tina@aaa')
- print(a)
- 执行结果如下:
- []
- ['tina']
- ['tina']
- ['tina']

3、特殊分组用法:
(?P<name>)
|
分组,除了原有的编号外再指定一个额外的别名 | (?P<id>abc){2} |
abcabc
|
(?P=name)
|
引用别名为<name>的分组匹配到字符串 | (?P<id>\d)abc(?P=id) |
1abc1
5abc5
|
\<number>
|
引用编号为<number>的分组匹配到字符串 | (\d)abc\1 |
1abc1
5abc5
|
4、贪婪匹配与非贪婪匹配
*?,+?,??,{m,n}? 前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配:
- a = re.findall(r"a(\d+?)",'a23b')
- print(a)
- b = re.findall(r"a(\d+)",'a23b')
- print(b)
- 执行结果:
- ['']
- ['']
- a = re.match('<(.*)>','<H1>title<H1>').group()
- print(a)
- b = re.match('<(.*?)>','<H1>title<H1>').group()
- print(b)
- 执行结果:
- <H1>title<H1>
- <H1>
- a = re.findall(r"a(\d+)b",'a3333b')
- print(a)
- b = re.findall(r"a(\d+?)b",'a3333b')
- print(b)
- 执行结果如下:
- ['']
- ['']
- #######################
- 这里需要注意的是如果前后均有限定条件的时候,就不存在什么贪婪模式了,非匹配模式失效。
re模块中常用功能函数
compile
编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
格式:
re.compile(pattern,flags=0)
pattern: 编译时用的表达式字符串。
flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的flags有:
标志 |
含义
|
re.S(DOTALL)
|
使.匹配包括换行在内的所有字符 |
re.I(IGNORECASE)
|
忽略大小写 |
re.L(LOCALE)
|
使预定字符类 \w \W \b \B \s \S 取决于当前区域设定 |
re.M(MULTILINE)
|
多行匹配,改变'^'和'$'的行为
|
re.X(VERBOSE)
|
详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释 |
re.U
|
使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性 |

- import re
- tt = "Tina is a good girl, she is cool, clever, and so on..."
- rr = re.compile(r'\w*oo\w*')
- print(rr.findall(tt)) #查找所有包含'oo'的单词
- 执行结果如下:
- ['good', 'cool']

match
- # match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
- match(pattern, string, flags=)
- # pattern: 正则模型
- # string : 要匹配的字符串
- # falgs : 匹配模式
- X VERBOSE Ignore whitespace and comments for nicer looking RE's.
- I IGNORECASE Perform case-insensitive matching.
- M MULTILINE "^" matches the beginning of lines (after a newline)
- as well as the string.
- "$" matches the end of lines (before a newline) as well
- as the end of the string.
- S DOTALL "." matches any character at all, including the newline.
- A ASCII For string patterns, make \w, \W, \b, \B, \d, \D
- match the corresponding ASCII character categories
- (rather than the whole Unicode categories, which is the
- default).
- For bytes patterns, this flag is the only available
- behaviour and needn't be specified.
- L LOCALE Make \w, \W, \b, \B, dependent on the current locale.
- U UNICODE For compatibility only. Ignored for string patterns (it
- is the default), and forbidden for bytes patterns.
- # 无分组
- r = re.match("h\w+", origin)
- print(r.group()) # 获取匹配到的所有结果
- print(r.groups()) # 获取模型中匹配到的分组结果
- print(r.groupdict()) # 获取模型中匹配到的分组结果
- # 有分组
- # 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)
- r = re.match("h(\w+).*(?P<name>\d)$", origin)
- print(r.group()) # 获取匹配到的所有结果
- print(r.groups()) # 获取模型中匹配到的分组结果
- print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组
Demo
search
- # search,浏览整个字符串去匹配第一个,未匹配成功返回None
- # search(pattern, string, flags=0)
- # 无分组
- r = re.search("a\w+", origin)
- print(r.group()) # 获取匹配到的所有结果
- print(r.groups()) # 获取模型中匹配到的分组结果
- print(r.groupdict()) # 获取模型中匹配到的分组结果
- # 有分组
- r = re.search("a(\w+).*(?P<name>\d)$", origin)
- print(r.group()) # 获取匹配到的所有结果
- print(r.groups()) # 获取模型中匹配到的分组结果
- print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组
- demo
Demo
findall
- # findall,获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中有多个组,则以列表形式返回,且每一个匹配均是元祖;
- # 空的匹配也会包含在结果中
- #findall(pattern, string, flags=0)
- # 无分组
- r = re.findall("a\w+",origin)
- print(r)
- # 有分组
- origin = "hello alex bcd abcd lge acd 19"
- r = re.findall("a((\w*)c)(d)", origin)
- print(r)
- Demo
Demo
re.match与re.search与re.findall的区别:
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
- a=re.search('[\d]',"abc33").group()
- print(a)
- p=re.match('[\d]',"abc33")
- print(p)
- b=re.findall('[\d]',"abc33")
- print(b)
- 执行结果:
- 3
- None
- ['', '']
finditer
搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。
格式:
re.finditer(pattern, string, flags=0)
- iter = re.finditer(r'\d+','12 drumm44ers drumming, 11 ... 10 ...')
- for i in iter:
- print(i)
- print(i.group())
- print(i.span())
- 执行结果如下:
- <_sre.SRE_Match object; span=(0, 2), match=''>
- (0, 2)
- <_sre.SRE_Match object; span=(8, 10), match=''>
- (8, 10)
- <_sre.SRE_Match object; span=(24, 26), match=''>
- (24, 26)
- <_sre.SRE_Match object; span=(31, 33), match=''>
- (31, 33)
sub
- # sub,替换匹配成功的指定位置字符串
- sub(pattern, repl, string, count=0, flags=0)
- # pattern: 正则模型
- # repl : 要替换的字符串或可执行对象
- # string : 要匹配的字符串
- # count : 指定匹配个数
- # flags : 匹配模式
- # 与分组无关
- origin = "hello alex bcd alex lge alex acd 19"
- r = re.sub("a\w+", "", origin, 2)
- print(r)
Demo
subn
返回替换次数
格式:
subn(pattern, repl, string, count=0, flags=0)
- print(re.subn('[1-2]','A','123456abcdef'))
- print(re.sub("g.t","have",'I get A, I got B ,I gut C'))
- print(re.subn("g.t","have",'I get A, I got B ,I gut C'))
- 执行结果如下:
- ('AA3456abcdef', 2)
- I have A, I have B ,I have C
- ('I have A, I have B ,I have C', 3)
split
- # split,根据正则匹配分割字符串
- split(pattern, string, maxsplit=0, flags=0)
- # pattern: 正则模型
- # string : 要匹配的字符串
- # maxsplit:指定分割个数
- # flags : 匹配模式
- # 无分组
- origin = "hello alex bcd alex lge alex acd 19"
- r = re.split("alex", origin, 1)
- print(r)
- # 有分组
- origin = "hello alex bcd alex lge alex acd 19"
- r1 = re.split("(alex)", origin, 1)
- print(r1)
- r2 = re.split("(al(ex))", origin, 1)
- print(r2)
- Demo
Demo
escape
把string中,除了字母和数字以外的字符,都加上反斜杆。
- >>> print(re.escape('abc123_@#$'))
- abc123_\@\#\$
- IP:
- ^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$
- 手机号:
- ^1[3|4|5|8][0-9]\d{8}$
- 邮箱:
- [a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+
常用正则表达式
re模块(Python中的正则表达式)的更多相关文章
- Python::re 模块 -- 在Python中使用正则表达式
前言 这篇文章,并不是对正则表达式的介绍,而是对Python中如何结合re模块使用正则表达式的介绍.文章的侧重点是如何使用re模块在Python语言中使用正则表达式,对于Python表达式的语法和详细 ...
- python模块 re模块与python中运用正则表达式的特点 模块知识详解
1.re模块和基础方法 2.在python中使用正则表达式的特点和问题 3.使用正则表达式的技巧 4.简单爬虫例子 一.re模块 模块引入; import re 相关知识: 1.查找: (1)find ...
- 在Python中使用正则表达式同时匹配邮箱和电话并进行简单的分类
在Python使用正则表达式需要使用re(regular exprssion)模块,使用正则表达式的难点就在于如何写好p=re.compile(r' 正则表达式')的内容. 下面是在Python中使用 ...
- Python学习-37.Python中的正则表达式
作为一门现代语言,正则表达式是必不可缺的,在Python中,正则表达式位于re模块. import re 这里不说正则表达式怎样去匹配,例如\d代表数字,^代表开头(也代表非,例如^a-z则不匹配任何 ...
- [Python]网络爬虫(七):Python中的正则表达式教程
转自:http://blog.csdn.net/pleasecallmewhy/article/details/8929576#t4 接下来准备用糗百做一个爬虫的小例子. 但是在这之前,先详细的整理一 ...
- [Python]网络爬虫(七):Python中的正则表达式教程(转)
接下来准备用糗百做一个爬虫的小例子. 但是在这之前,先详细的整理一下Python中的正则表达式的相关内容. 正则表达式在Python爬虫中的作用就像是老师点名时用的花名册一样,是必不可少的神兵利器. ...
- python中使用正则表达式处理文本(仅记录常用方法和参数)
标准库模块 python中通过re模块使用正则表达式 import re 常用方法 生成正则表达式对象 compile(pattern[,flags]) pattern:正则表达式字符串 flags: ...
- Python学习-38.Python中的正则表达式(二)
在Python中,正则表达式还有较其他编程语言有特色的地方.那就是支持松散正则表达式了. 在某些情况,正则表达式会写得十分的长,这时候,维护就成问题了.而松散正则表达式就是解决这一问题的办法. 用上一 ...
- 在python中使用正则表达式(转载)
https://www.cnblogs.com/hanmk/p/9143514.html 在python中使用正则表达式(一) 在python中通过内置的re库来使用正则表达式,它提供了所有正则表 ...
随机推荐
- NIO之Charset类字符编码对象
Charset类字符编码对象 介绍 java中使用Charset来表示编码对象 This class defines methods for creating decoders and encoder ...
- Atitit.biz业务系统 面向框架 面向模式---------数据映射imp
Atitit.biz业务系统 面向框架 面向模式---------数据映射imp 1.1. 面向变量 面向过程 面向对象 面向组件 面向框架 面向服务 面向模式1 1.2. 第2章 架构模式 ...
- I2S与pcm的区别
I2S仅仅是PCM的一个分支,接口定义都是一样的, I2S的采样频率一般为44.1KHZ和48KHZ做,PCM采样频率一般为8K,16K.有四组信号: 位时钟信号,同步信号,数据输入,数据输出. I2 ...
- Python归并排序(递归实现)
为什么归并排序如此有用?1. 快捷和稳定归并排序成为⼀一个非常棒的排序算法主要是因为它的快捷和稳定.它的复杂度即使在最差情况下都是O(n log n).而快速排序在最差情况下的复杂度是O(n^2),当 ...
- eclipse 建立maven项目 显示红叉的解决方法
1.建立好之后就会发现项目有红叉. 这时发现查查在main处,打开项目>属性>Java Build Path>source,发现里边有红叉(如下图),这是由于我们的src/main下 ...
- abp使用风格定义
一个开发人员的开发模式下面.用这个有太多代码要写了.所以需要限制与规范自己: 基于abp新系统的开发过程1>*.Core 增加文件夹eg:Questions1.1>增加实体文件eg:QAQ ...
- Unity3D 移动开发代码优化
1. 尽量避免每帧处理 比方: function Update() { DoSomeThing(); } 可改为每5帧处理一次: function Update() { if(Time.frameCo ...
- 【Mac + Python3.6 + ATX基于facebook-wda】之IOS自动化(一):WebDriverAgent安装
此篇介绍如何安装WebDriverAgent,下一篇介绍facebook-wda库的安装使用以及自动化脚本的开发. 前言: 对于iOS的应用的测试,如果不需要用到图像识别,推荐使用这个项目facebo ...
- python cookies 爬虫处理
Cookie Cookie 是指某些网站服务器为了辨别用户身份和进行Session跟踪,而储存在用户浏览器上的文本文件,Cookie可以保持登录信息到用户下次与服务器的会话. Cookie原理 HTT ...
- python django -2 ORM模型
ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...