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. Cocos2d-x3.0 触摸事件

    TouchableSpriteTest auto winSize = Director::getInstance()->getWinSize(); Point origin = Director ...

  2. Activiti源代码分析

    ExecutionEntity内部含有parent,是一个运行树或运行路径.应该是一个流程实例的运行过程,一个实例相应一个ExecutionEntity,通过getActivity得到的是当前正在运行 ...

  3. WAS集群系列(2):数据库连接低级错误——网络连接问题

    环境 项目点 指标 WAS版本号 7.0 应用server操作系统 Windows 2008 应用server系统位数 64bit 数据库server操作系统 CentOS 5.6 数据库版本号 Or ...

  4. 基于Metronic的Bootstrap开发框架经验总结(18)-- 在代码生成工具Database2Sharp中集成对Bootstrap-table插件的分页及排序支持

    在我们开发系统界面,包括Web和Winform的都一样,主要的界面就是列表展示主界面,编辑查看界面,以及一些辅助性的如导入界面,选择界面等,其中列表展示主界面是综合性的数据展示界面,一般往往需要对记录 ...

  5. Python的几个常用模块

    一.sys 用于提供对Python解释器相关的操作: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version ...

  6. 关于postgres中的一些宏的tips

    Postgresql作为C语言开发的代码,其中大量的运用了一些宏的操作. 因此理解这些宏很重要,然而有时候这些宏总让人很费解. 作为一个经常翻翻postgresql源码的小白,在这里做一个记录吧,方便 ...

  7. Redis命令与配置

    命令 开启服务端 redis-server.exe redis.conf 客户端连接 redis-cli.exe -h 127.0.0.1 -p 6379 1.连接操作相关的命令 quit:关闭连接( ...

  8. idea和Webstorm上使用git和github,码云

    由于之前一直使用svn,现在项目使用git,顾根据网上找的学习资料,自己梳理了下,收获蛮多,这里做个记录,如果能帮助到您那是最好不过的. 1.大致步骤 使用工具:idea,github,码云 webs ...

  9. 【java】获取当前环境属性及编码乱码示例

    package 字符编码; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; impo ...

  10. IDA分析脱壳后丢失导入表的PE

    1. 问题 一些程序经过脱壳后(如用OD的dump插件),一些导入表信息丢失了,导致拖入IDA后看不到API的信息(如右图所示,第一个红圈处实际是GetCurrentProcessId),给分析造成极 ...