1、正则表达式基础

正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不然str自带方法,但功能十分强大。

正则表达式的大致匹配流程:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。

python支持的正则表达式元字符和语法:

模式 描述
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n}  
re{ n,} 精确匹配n个前面表达式。
re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b 匹配a或b
(re) G匹配括号内的表达式,也表示一个组
(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re) 类似 (...), 但是不表示一个组
(?imx: re) 在括号中使用i, m, 或 x 可选标志
(?-imx: re) 在括号中不使用i, m, 或 x 可选标志
(?#...) 注释.
(?= re) 前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re) 匹配的独立模式,省去回溯。
\w 匹配字母数字及下划线
\W 匹配非字母数字及下划线
\s 匹配任意空白字符,等价于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9].
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。c
\z 匹配字符串结束
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等. 匹配一个换行符。匹配一个制表符。等
\1...\9 匹配第n个分组的内容。
\10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

正则表达式修饰符-可选标志

正则表达式可以包含一些可选标志修饰符来控制匹配的模式,修饰符被指定为一个可选的标志,多个标志可以通过按位or(|)来指定。

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

2、re方法

python从1.5开始增加了re模块,它提供了perl风格的正则表达式模式。

re模块使python语言拥有全部的正则表达式功能。

re模块方法:

re.match

尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功则返回none。

re.match语法:re.match(pattern,string,flags=0)

pattern:匹配的正则表达式,string:要匹配的字符串,flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等。

>>> import re
>>> print(re.match('abc','abcefg').group()) #匹配开头,group方法返回分组字符串。
abc
>>> r1 = re.match('abc','1abcefg')
>>> print(r1) #开头未匹配到返回none
None

re.search(pattern, string, flags=0)

用于查找字符串中可以匹配成功的子串,从string的开始位置匹配到结尾,匹配成功则返回一个匹配结果不再向后匹配了,如匹配失败则返回None。

>>> pattern = re.search('w','aw,bw,cw,dw')  #匹配结果
>>> print(pattern) #返回一个match对象
<_sre.SRE_Match object at 0x7fcfa3566920>
>>> pattern.group() #获取一个分组截获的字符串
'w'
>>> pattern.start() #截获字符串的开始索引
1
>>> pattern.end() #截获字符串的结束索引
2

re.split(pattern, string, maxsplit=0, flags=0)

按照能够匹配的字符串以列表的形式分隔返回不能匹配到的字串,maxsplit用于指定最大分割次数,不指定将全部分割。

>>> print(re.split('[0-9]','a1b2c3'))
['a', 'b', 'c', '']
#返回不能匹配的对象,以列表的形式

re.findall(pattern, string, flags=0)

搜索string,以列表的形式返回全部能匹配到的字串。

>>> print(re.findall('[0-9]','a1b2c3'))
['', '', '']
>>> print(re.findall('\d+','a21b32c35'))
['', '', '']
#以列表的形式返回所有匹配的子串,\d+为匹配1到多个数字

re.finditer(pattern, string, flags=0)

搜索string,返回访问每一个匹配结果的match对象的迭代器

>>> pat = re.finditer('\d+','aa123bb456cc')  #返回match对象的一个迭代器
>>> print(pat)
<callable_iterator object at 0x7fcfa354df10>
>>> for i in pat: #循环迭代器取值
... print(i.group())
...
123
456

re.sub(pattern, repl, string, count=0, flags=0)

使用repl替换string中每一个匹配的子串后返回替换后的字符串。count用于指定最多替换的次数,不知道时全部替换。

>>> pat = re.sub('\d+','@@@','aaa1bbb22ccc333')
>>> print(pat) #替换匹配对象
aaa@@@bbb@@@ccc@@@
>>> print(re.sub('\d+','@@@','aaa1bbb22ccc333',count=2))
aaa@@@bbb@@@ccc333 #只替2次匹配到的子串

re.subn(pattern, repl, string, count=0, flags=0)

返回一个元组包含(新的替换字串,数量)

>>> print(re.subn('\d+','@@@','aaa1bbb22ccc333',count=2))
('aaa@@@bbb@@@ccc333', 2)
#返回repl替换的对象和替换的次数

re.compile(pattern,flags=0)

编译一个正则表达式模式,返回一个模式对象

>>> import re
>>> re1 = re.compile(r'hello') #编译一个正则匹配模式
>>> print(type(re1))
<class '_sre.SRE_Pattern'> #该模式是一个pattern对象
>>> print(re.match(re1,'hello world').group())
hello

3、match对象方法

patt = re.search('(\d+),(\d+)','11,3dsfdsa3324fdag4556'
>>> print(type(patt)) #返回一个match对象
<class '_sre.SRE_Match'>
#string匹配时使用的文本
>>> print(patt.string)
11,3dsfdsa3324fdag4556
#re匹配时使用的正则模式(pattern对象)
>>> print(patt.re)
<_sre.SRE_Pattern object at 0x7fcfa3c4b530>
#regs返回分组索引
>>> print(patt.regs)
((0, 4), (0, 2), (3, 4))
#pos开始搜索的索引
>>> print(patt.pos)
0
#endpos结束搜索的索引
>>> print(patt.endpos)
22
#lastindex最后一个被捕获的分组在文本中的索引
>>> print(patt.lastindex)
2
#lastindex最后一个捕获的分组的别名,如没有则返回None
>>> print(patt.lastgroup)
None
#group()获得一个或多个分组截获的字符串
>>> print(patt.group())
11,3
#获得第1个分组的字符串
>>> print(patt.group(1))
11
>>> print(patt.group(2))
3
#groups()以元祖的形式返回全部分组截获的字符串
>>> print(patt.groups())
('', '')
#groupdict()返回已有别名的组的别名为健,以该组截获的子串味值的字典
>>> print(patt.groupdict())
{}
#start()返回组截获的子串在string中的起始索引
>>> print(patt.start())
0
>>> print(patt.start(1))
0
#返回第2个分组的起始索引
>>> print(patt.start(2))
3
#stop()返回组截获的子串在string中的结束索引
>>> print(patt.end(2))
4
>>> print(patt.end(1))
2
#返回开始和结束的索引
>>> print(patt.span())
(0, 4)
#返回第1个分组的开始结束索引
>>> print(patt.span(1))
(0, 2)
>>> print(patt.span(2))
(3, 4)

python3之正则表达式的更多相关文章

  1. python3.5 正则表达式

    我们平时上网的时候,经常需要在一些网站上注册帐号,而注册帐号的时候对帐号名称会有一些要求. 比如: 上面的图片中,输入的邮件地址.密码.手机号 才可以注册成功. 我们需要匹配用户输入的内容,判断用户输 ...

  2. python3的正则表达式(regex)

    正则表达式提供了一种紧凑的表示法,可用于表示字符串的组合,一个单独的正则表达式可以表示无限数量的字符串.常用的5种用途:分析.搜索.搜索与替代.字符串的分割.验证. (一)正则表达式语言python中 ...

  3. python3.x 正则表达式的应用

    正则表达式是我认为比较难的一个东西,今天忽然又学到了这个,想到写下来,以后作为参考手册使用. python如果想使用python需要引用re方法,在文件开始进行引用. import re 接下来说一下 ...

  4. Python3之正则表达式详解

    正则表达式 本节我们看一下正则表达式的相关用法,正则表达式是处理字符串的强大的工具,它有自己特定的语法结构,有了它,实现字符串的检索.替换.匹配验证都不在话下. 当然对于爬虫来说,有了它,我们从HTM ...

  5. Python3(七) 正则表达式与JSON

    一. 初识正则表达式 1.定义:是一个特殊的字符序列,可以帮助检测一个字符串是否与我们所设定的字符序列相匹配. 2.作用:可以实现快速检索文本.实现替换文本的操作. 3.场景: 1.检测一串数字是否是 ...

  6. 自己动手实现html去标签和文本提取

    随意观看 [TOC] 工具 python3.6 正则表达式(别的语言思路一样,容易借鉴) python正则表达式:flags的应用 这里主要介绍一下re.compile(pattern[, flags ...

  7. 537. Complex Number Multiplication

    题目大意: 给出a, b两个用字符串表示的虚数,求a*b 题目思路: 偷了个懒,Python3的正则表达式匹配了一下,当然acm里肯定是不行的 class Solution: def complexN ...

  8. Python爱好者社区历史文章列表(每周append更新一次)

    2月22日更新:   0.Python从零开始系列连载: Python从零开始系列连载(1)——安装环境 Python从零开始系列连载(2)——jupyter的常用操作 Python从零开始系列连载( ...

  9. Python3 如何优雅地使用正则表达式(详解一)

    注:本文翻译自 Regular Expression HOWTO,小甲鱼童鞋对此做了一些注释和修改. 正则表达式介绍 正则表达式(Regular expressions 也称为 REs,或 regex ...

随机推荐

  1. 【c语言】实现一个函数,求字符串的长度,不同意创建第三方变量

    // 实现一个函数,求字符串的长度.不同意创建第三方变量. #include <stdio.h> #include <assert.h> int my_strlen_no(ch ...

  2. pku 2488 A Knight&#39;s Journey (搜索 DFS)

    A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28697   Accepted: 98 ...

  3. Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)

    题目地址:http://codeforces.com/contest/474/problem/F 由题意可知,最后能够留下来的一定是区间最小gcd. 那就转化成了该区间内与区间最小gcd数相等的个数. ...

  4. Array的基本操作

    准备饿补基础技术,先来个数组的总结. 1 .合并操作    concat :   var C = A.concat(B);    用A数组合并B数组,生成新的C数组.      循环插入        ...

  5. Learning to Rank算法介绍:GBRank

    之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to R ...

  6. 关于在Windows下Composer下载安装Yii2.0

    先是composer的安装,主要有两个方式,一个直接下载安装包安装,Composer-steup.exe文件,第二种直接下载composer.phar文件,用php去运行这个文件可以一样起到作用,之后 ...

  7. Hibernate--使用注解配置映射关系

    写在前面: 配置实体类与数据库的映射关系,有两种方式: 1.使用*.hbm.xml    :  2.使用@注解 一:注解的方式: 1.@Entity 加在类的前面,将类声明为持久化类. 2.@Tabl ...

  8. docker入门【1】

    1.拉取镜像 docker pull 镜像名:版本号 例如:docker pull tomcat:7.0 默认会从docker官方镜像库拉取,不指定版本的话版本为latest 拉取后docker im ...

  9. sqlserver 存储过程 递归查询分组+hierarchyid重建会员关系

    CREATE PROCEDURE [dbo].[GetGroupInfo] @s_code NVARCHAR() = --会员卡号 AS BEGIN declare @p int; --查询唯一性结果 ...

  10. iOS 页面之间的专长动画控制器间的转换

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 24.0px; font: 14.0px "Heiti SC Light" ...