一,介绍

正则表达式(RE)是一种小型的,高度专业化的编程语言,在python中它内嵌在python中,并通过re模块实现。正则表达式模式被编译成一系列的字节码,然后由C编写的匹配引擎执行。

字符匹配(普通字符,元字符):

1 普通字符:大多数字符和字母都会和自身匹配
              >>> re.findall('alex','yuanaleSxalexwupeiqi')
                      ['alex']

2 元字符:. ^ $ * + ? { } [ ] | ( ) \

二,元字符

(一)点.通配符,代替除了换行符\n以外的任意一个字符

>>> import re
>>> re.findall("alex","sdffalexjj")
['alex']
>>> re.findall("a..x","sdffalexjj")
['alex']
>>> re.findall("a...x","sdffalexjj")
[]

(二)尖角号^,表示以后面的字符串开头;$符,表示以前面的字符串结尾。

>>> re.findall("^a..x","asdffalexjj")
[]
>>> re.findall("^a..x","asdxfalexjj")
['asdx']
>>> re.findall("a..x$","asdxfa22x")
['a22x']

(三)重复符号,* + ? { }

1,*是重复紧挨着的字符,从0次到无穷次

>>> re.findall("alex*","asdxfale")
['ale']

2,+是1到无穷次,如果没有(0次)就匹配不上

>>> re.findall("alex+","asdxfale")
[]
>>> re.findall("alex+","asdxfalexxx")
['alexxx']

3,?是0或者1次

>>> re.findall("alex?","asdxfalexxx")
['alex']
>>> re.findall("alex?","asdxfale")
['ale']

4,{}自定义范围   {0,}==*   {1,}==+   {0,1}==?  {6}==重复6次  {1,6}重复1到6次

>>> re.findall("alex{6}","asdxfalexxxxxx")
['alexxxxxx']
>>> re.findall("alex{6}","asdxfalex")
[]
>>> re.findall("alex{0,1}","asdxfalex")
['alex']
>>> re.findall("alex{0,1}","asdxfale")
['ale']

注意*,+,?等都是贪婪匹配,后面加?号使其变成惰性匹配

>>> re.findall('abc*?','abcccccc')
['ab']
>>> re.findall('abc*','abcccccc')
['abcccccc']
>>> re.findall('abc+?','abcccccc')
['abc']

(四)字符集[]

实现或的逻辑

>>> re.findall('x[yz]','xyuuxzuu')
['xy', 'xz']
>>> re.findall('x[yz]p','xypuuxzuu')
['xyp']
>>> re.findall('x[y,z]p','xypuuxzuux,p')
['xyp', 'x,p']

[]内只有三个字符例外

1,-表示范围

>>> re.findall('x[a-z]','xypuuxzuux,p')
['xy', 'xz']
>>> re.findall('x[a-z]*','xypuuxzuux')
['xypuuxzuux']
>>> re.findall('x[a-z]*','xypuuxzuux9n')
['xypuuxzuux']

2,^非

>>> re.findall('x[^a-z]','x12')
['x1']
>>> re.findall('x[^a-z]','xy')
[]
>>> re.findall("\([^()]*\)","12+(34*6+2-5*(2-1))")
['(2-1)']

3,\  后面跟元字符去除特殊功能,比如\.

后面跟普通字符实现特殊功能,比如\d

\d  匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s  匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b  匹配一个特殊字符边界,比如空格 ,&,#等

>>> re.findall("\d","12+(34*6+2-5*(2-1))")
['', '', '', '', '', '', '', '', '']
>>> re.findall("\d+","12+(34*6+2-5*(2-1))")
['', '', '', '', '', '', '']
>>> re.findall("[0-9]+","12+(34*6+2-5*(2-1))")
['', '', '', '', '', '', '']
>>> re.findall("\D+","12+(34*6+2-5*(2-1))")
['+(', '*', '+', '-', '*(', '-', '))']
>>> re.findall("\D+","hello world")
['hello world']
>>> re.findall("\s+","hello world")
[' ']
>>> re.findall("\S+","hello world")
['hello', 'world']
>>> re.findall("\w+","hello_world")
['hello_world']
>>> re.findall("\W+","~!@#$%^&*()")
['~!@#$%^&*()']
>>> re.findall("www\.baidu","www.baidu")
['www.baidu']

\b的用法讨论。re.findall("I\b","I am ooo"),这里面python解释器会识别出\b,并处理后交给re模块,re模块收到的不再是\b,于是产生问题。

解决方法1:使用r(raw string原生字符串)re.findall(r"I\b","I am ooo")

解决方法2:使用\\,由python解释器处理一次,去掉一个\,传给re模块就变成\b,re.findall("I\\b","I am ooo")

举例:找出"c\l",反推re模块接收为"c\\l",反推python解释器接收为"c\\\\l",最后re.findall("c\\\\l","I am oc\lo")   

>>> re.findall("c\\\\l","I am oc\lo")
['c\\l']

(五)管道符|

|之前是一部分,|之后是一部分,两者是或的关系

>>> re.findall("ka|b","I am ka|b")
['ka', 'b']

(六)分组介绍

1,匿名分组使用()

>>> re.findall("(abc)+","I am abcd")
['abc']

注意:如果使用()分组,findall会优先显示匹配到的分组()里面的内容,而不是匹配的全部内容

如果就想要www.baidu.com完整匹配,需要在括号里加入?:

>>> re.findall("www\.(baidu|163)\.com","dfsgfwww.baidu.com112")
['baidu']
>>> re.findall("www\.(?:baidu|163)\.com","dfsgfwww.baidu.com112")
['www.baidu.com']

  利用“优先显示匹配到的结果”解释下面的的现象

>>> re.findall("(abc)+","I am abcabcabc")
['abc']

  上面实际把abc作为一个整体匹配,匹配到1次,结果是abcabcabc,但是只显示1个abc。如果想要全部显示,则需要使用上面的?:,如下:

>>> re.findall("(?:abc)+","I am abcabcabc")
['abcabcabc']

  这种整体分组使用括号()匹配和单个字符匹配abc+是不一样的,如下abc+匹配到了3次而不是像上面分组的1次

>>> re.findall("abc+","I am abcabcabc")
['abc', 'abc', 'abc']

  同理,分组的匹配出现多次的情况:

>>> re.findall("(abc)+","I am abcabc111abc")
['abc', 'abc']

2,命名分组:?P<name>对匹配没有任何影响,只是起了一个分组的名字叫name,而name作为group方法调用的参数。实际对匹配起作用的仍然是[a-z]+)\d+

>>> re.search("(?P<name>[a-z]+)\d+","alex36wusir34xialv33").group()
'alex36'
>>> re.search("(?P<name>[a-z]+)\d+","alex36wusir34xialv33").group("name")
'alex'
>>> re.search("(?P<name>[a-z]+)(?P<age>\d+)","alex36wusir34xialv33").group("age")
''

三,方法

1,findall,返回所有满足匹配条件的结果,放在列表里

2,serach,在字符串内查找模式匹配,找到第一个然后返回一个对象。通过调用group()方法得到匹配的字符串,如果字符串没有匹配返回None

3,match,只会在开始处进行匹配

>>> re.match("(\d+)","alex36wusir34xialv33")
>>> re.match("(\d+)","56alex36wusir34xialv33")
<_sre.SRE_Match object; span=(0, 2), match=''>
>>> re.match("(\d+)","56alex36wusir34xialv33").group()
''

4,split,分割函数

>>> re.split("[ |]","hello abc|def")
['hello', 'abc', 'def']
>>> re.split("[ab]","asdabcd")
['', 'sd', '', 'cd']
>>> re.split("[ab]","abc")
['', '', 'c']

5,sub,替换函数,4个参数:1:模式,2:替换为字符,3:搜索字符串,4:替换次数

>>> re.sub("\d+","A","J12abc234ffg55")
'JAabcAffgA'
>>> re.sub("\d","A","J12abc234ffg55")
'JAAabcAAAffgAA'
>>> re.sub("\d","A","J12abc234ffg55",4)
'JAAabcAA4ffg55'
>>> re.subn("\d","A","J12abc234ffg55")
('JAAabcAAAffgAA', 7)

6,compile,模式先编译好,以后就可以直接调用。好处是写一次可以使用多次提高效率。

>>> com=re.compile("\d+")
>>> com.findall("fjlkdad234hfjksd3421")
['', '']
>>> com.findall("444adf555")
['', '']

7,finditer,返回的是迭代器对象,不再是列表。好处和迭代器是一样的。

>>> ret=re.finditer("\d","sdfds123fr")
>>> next(ret).group()
''
>>> next(ret).group()
''

参考:http://www.cnblogs.com/yuanchenqi/articles/5732581.html

【笔记】Python基础七:正则表达式re模块的更多相关文章

  1. python基础之正则表达式 re模块

    内容梗概: 1. 正则表达式 2. re模块的使⽤ 3. 一堆练习正则表达式是对字符串串操作的一种逻辑公式. 我们一般使用正则表达式对字符串进行匹配和过滤.使用正则的优缺点: 优点: 灵活,功能性强, ...

  2. 十七. Python基础(17)--正则表达式

    十七. Python基础(17)--正则表达式 1 ● 正则表达式 定义: Regular expressions are sets of symbols that you can use to cr ...

  3. Java基础七-正则表达式

    Java基础七-正则表达式 一.定义: 特定的符号的组合 二.作用: 用于操作字符串数据 三.优缺点 简化代码,但是阅读性差 四.引入 4.1 问题 判断一个号码是否是QQ号? 不是零开头 6-15位 ...

  4. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  5. Python基础之 正则表达式指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...

  6. Python基础(十)-模块

    模块初识 一般把不同功能代码放到不同py文件,一个py文件就是一个模块 三种模块库: 1.Python标准库 2.第三方库 3.自定义库 导入模块:import 库名 (Python解释器只认识执行文 ...

  7. python基础(10)--模块

    模块(module) 模块,用一坨代码实现了某个功能的代码集合 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来 ...

  8. Python基础(12)--模块

    本文地址:http://www.cnblogs.com/archimedes/p/python-modules.html,转载请注明源地址. 模块简介 如果你退出 Python 解释器重新进入,以前创 ...

  9. python基础之正则表达式

    正则表达式语法 正则表达式 (或 RE) 指定一组字符串匹配它;在此模块中的功能让您检查一下,如果一个特定的字符串匹配给定的正则表达式 (或给定的正则表达式匹配特定的字符串,可归结为同一件事). 正则 ...

  10. python基础之正则表达式。

    简介 就其本质而言,正则表达式是内嵌在python内,由re模块实现,小型的专业化语言,最后由c写的匹配引擎执行.正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来 ...

随机推荐

  1. 更新 TeX Live 软件包

    这个 TeX Live 软件,你得时常更新一下,不然会遇到一些由软件包自身 Bug 导致的编译问题.比如,这次我使用 Beamer 软件包写演示文稿,就遇到问题了,结果发现是软件包自身存在的问题.安装 ...

  2. OpenLayers加载谷歌地图服务

    谷歌地图的地址如下: 谷歌交通地图地址:http://www.google.cn/maps/vt/pb=!1m4!1m3!1i{z}!2i{x}!3i{y}!2m3!1e0!2sm!3i3800725 ...

  3. 廖雪峰Java8JUnit单元测试-1JUnit简介-1JUnit测试

    测试驱动开发(Test Driver Development) 1.使用main()方法测试的缺点: 只能有1个main()方法,不能把测试代码分离 没有打印出测试结果和期望结果,例如expected ...

  4. Java BASE58 以及 md5,sha256,sha1

    package cn.ubibi.wsblog.utils; import java.io.UnsupportedEncodingException; import java.math.BigInte ...

  5. ORA-27302: 错误发生在: sskgpwrm1

    opidrv aborting process M002 ospid (3561) as a result of ORA-600ORA-27300: 操作系统相关操作: semctl 失败, 状态为: ...

  6. lucene搜索之高级查询

    使用Query子类查询 MatchAllDocsQuery TermQuery NumericRangeQuery BooleanQuery 使用QueryParser QueryParser Mul ...

  7. HashTable源码简单介绍

    首先是继承了字典类Dictionary, 这说明HashTable的一些找位置的实现与Dictionary有关, 看一看数据结构,是一个entry数组, Entry,这个不陌生,先看一下它的结构吧,这 ...

  8. docker的核心概念和安装

    里Dcoker的安装要求 我这里安装的是在vmware下的centos7 64位 并且通过模拟远程连接xshell 我在安装好之后就配置了静态ip,这里我就不多说怎么配置了 具体静态ip配置可以参考 ...

  9. MyBatis注解-动态SQL 一个 SqlProvider的demo

    Provider动态语言注解 MyBatis提供了多个注解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,这些都是建 ...

  10. 关于matlab2018a版本错误使用 svmclassify 分类器

    当我们照常使用分类器函数svmclassify时,2018版的matlab会报出以下错误: 解决办法: 1,下载libsvm(一般下载最新版本就ok了)包,并将其添加至matlab的toolbox文件 ...