正则表达式,是一个特殊的字符串, 是对一类字符串的描述 ( 怎么描述一类字符: 普通字符+元字符+重复)
检测给定的字符串,是否和正则表达式描述的字符串相匹配

举例:
1) 检查一串数字是否是电话号码
2) 检测一个字符串是否符合email的标准
3) 把一个文本中的指定单词替换为另一个单词

Python提供的则这则表达式模块: re

普通字符: 具体的一个个字符

元字符: 表示一类字符
\d      匹配0~9的任意一个数字字符
\D     匹配1个非数字字符
\w     匹配1个数字,字母,下划线, [A-Za-z0-9_] (单词字符)
\W    匹配1个非单词字符(空格,\n, \r, \t, 也是非单词字符)
\s     匹配1个\n, \r, \t, 空格 (空白字符)
\S    匹配1个非空白字符
.      匹配除换行符\n之外的所有字符

{n}                 修饰前面的元字符或普通字符,表示重复n次
[a-z]{3}          3个a到z的任意字符

{n,m}            修饰前面的元字符或普通字符,最小重复次数为n, 最大重复次数为6
[a-z]{3,6}      默认python会贪婪匹配,尽可能多的匹配,看6个连续字符是否存在,没有则看5个连续字符是否存在,以此类推
[a-z]{3,6}?    手工指定非贪婪方式进行匹配,尽可能少的匹配: 有3个连续的字符匹配到就做为1个结果字符串返回

*      匹配*前面的单个字符, 0次或无限多次
+     匹配+前面的单个字符,1次或无限多次
?     匹配?前面的单个字符,0次或1次 (python? --> pythonn ->返回结果:python(也是贪婪匹配)
       经常用于去重(python? -> pythonnnnnn -> 返回结果:python)
       ?有两种用法,手工指定非贪婪,重复0次或1次,重点是?前面修饰的是{n,m},还是字符(普通字符/元字符)

^ $
^\d{4,8}$,      ^, 字符串的开始, 字符串必须以数字字符开头
                     $, 字符串结尾,最多连续8个数字字符后,字符串就结束,后面不能再有更多的字符
                     这个例子的含义:4到8个连续数字字符

[nm]       匹配字符n或者字符m
[^nm]     匹配不是字符n和不是字符m的其他字符
[n-m]      匹配n到m的任意一个字符

方法: 查找所有匹配的子串
findall(pattern, string, flags=0)       返回1个list, string中匹配pattern的所有子串,没有则返回空list

flags 匹配模式参数
flags=re.I                    忽略大小写来匹配
flags=re.I | re.S           多个模式一起用,re.S( .将匹配所有的字符,包括\n)

方法: 匹配并替换
sub(pattern, replace, string, count=0, flags=0)      将string中所有匹配pattern的子串,替换为replace,生成新的string返回
                                                                              count=n, 从做到右最多替换n次
                                                                              count=0, 全部替换,不限定替换次数
                                                                              replace还可以传入1个函数(意义:根据不同的匹配子串,替换为不同的值)

import re
language = 'C|C#|C++|Python|Java|Scala|Go'
pattern = 'C[#+]*'
replace = 'Go'
result = re.sub(pattern,replace,language)     # 替换后生成新字符串,原始字符串并不改变(字符串不可改变)
print(result)

# replace传入函数
def convert(value):
pass

result = re.sub(pattern,convert,language)
print(result) # '|||Python|Java|Scala|Go'

运行机制:python会将匹配到的子串,作为convert函数的形参传入,convert函数的返回值将被作为替换字符,生成新字符串
                  由于convert没有返回任何值,匹配到的字符会被替换为 空字符
                  说明: 本质上是将匹配到的子串,生成1个匹配实例传入

# replace传入函数
def convert(value):
print(value)                         # <_sre.SRE_Match object; span=(0, 1), match='C'>
print(value.group())            # value.group(), 返回匹配到的子串内容

result = re.sub(pattern,convert,language)
print(result)                        # '|||Python|Java|Scala|Go'

# 将函数作为参数传入re.sub (实例2)

def convert(value):
"""
匹配到的大于6的数字字符,替换为9
匹配到的小于6的数字字符,替换为0
“”“
match = value.group()

if isinstance(int(match), int) and int(match) >= 6:
return '9'
elif isinstance(int(match),int) and int(match) < 6:
return '0'

方法: re.match
match(pattern, string, flags=0)    从string的首字符开始匹配,找到第一个匹配结果,就返回1个match实例,或者None
                                                    区别于findall: 1)从第一个字符开始匹配 2)只找1个匹配结果 3)返回结果是match实例

import re
s = 'ABC123788DEF'
pattern = '\d'

result = re.match(pattern, s)
print(result) # None,因为开头没有数字

方法: re.search
search(pattern, string, flags=0)    搜索整个string,找到第一个匹配结果,就返回1个match实例,或者None
                                                     区别于findall: 1) 只找1个匹配结果 2)返回结果是match实例

import re
s = 'ABC123788DEF'
pattern = '\d'

result = re.search(pattern, s)
print(result)                                # result, 是匹配实例
print(result.group())                   #  '1',  只匹配1个

分组 group

1、组括号    -- pattern中的分组
(python){3}   ()内的字符是且的关系,[]内的字符是或的关系

2、groups()    -- 获取匹配对象中的各个分组
     group()  -- 获取匹配对象中个整个匹配结果, group(0)

#  获取匹配结果中的指定部分,group()
import re
s = 'life is short, i use python'
pattern = 'life(.*)python'                       # pattern中的分组
result = re.search(pattern,s)

print(result)                                           # 匹配对象
print(result.group())                              # 获取整个匹配结果,默认参数=0,将整个结果作为1个group返回

print(result.group(1))                            # 获取匹配结果中的第一个分组(从左往右)
print(result.groups())                            # 获取结果中的所有分组, tuple实例

常见正则表达式参考:
http://www.cnblogs.com/zxin/archive/2013/01/26/2877765.html

01_re正则表达式的更多相关文章

  1. JS正则表达式常用总结

    正则表达式的创建 JS正则表达式的创建有两种方式: new RegExp() 和 直接字面量. //使用RegExp对象创建 var regObj = new RegExp("(^\\s+) ...

  2. Python高手之路【五】python基础之正则表达式

    下图列出了Python支持的正则表达式元字符和语法: 字符点:匹配任意一个字符 import re st = 'python' result = re.findall('p.t',st) print( ...

  3. C# 正则表达式大全

    文章导读 正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串.正则表达式无疑是处理文本最有力的工具,而.NET提供的Regex类实现了验证正则表达式的方法.Regex 类表示不可变(只读)的 ...

  4. C#基础篇 - 正则表达式入门

    1.基本概念 正则表达式(Regular Expression)就是用事先定义好的一些特定字符(元字符)或普通字符.及这些字符的组合,组成一个“规则字符串”,这个“规则字符串”用来判断我们给定的字符串 ...

  5. JavaScript正则表达式,你真的知道?

    一.前言 粗浅的编写正则表达式,是造成性能瓶颈的主要原因.如下: var reg1 = /(A+A+)+B/; var reg2 = /AA+B/; 上述两个正则表达式,匹配效果是一样的,但是,效率就 ...

  6. Python 正则表达式入门(中级篇)

    Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...

  7. 【JS基础】正则表达式

    正则表达式的() [] {}有不同的意思. () 是为了提取匹配的字符串.表达式中有几个()就有几个相应的匹配字符串. (\s*)表示连续空格的字符串. []是定义匹配的字符范围.比如 [a-zA-Z ...

  8. JavaScript 正则表达式语法

    定义 JavaScript定义正则表达式有两种方法. 1.RegExp构造函数 var pattern = new RegExp("[bc]at","i"); ...

  9. [jquery]jquery正则表达式验证(手机号、身份证号、中文名称)

    数字判断方法:isNaN()函数 test()方法 判断字符串中是否匹配到正则表达式内容,返回的是boolean值 ( true / false ) // 验证中文名称 function isChin ...

随机推荐

  1. CSS表格(未完成)

    CSS 表格 使用 CSS 可以使 HTML 表格更美观. 表格边框 指定CSS表格边框,使用border属性. 下面的例子指定了一个表格的Th和TD元素的黑色边框:

  2. 测试人员需要了解的sql知识(提高篇)

    上一篇写了一些基础的sql知识,这里再深挖一些常用的 ------------------------------------------------------------------骄傲的分割线- ...

  3. Perl中的输入输出流(三)

    Perl中读取标准输入:<STDIN> foreach (<STDIN>)  { print "I saw $_";} 钻石操作符<>:它的参数 ...

  4. 用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台)

    windows   --> windows 写法均在py3.6 客户端写法 import socket client = socket.socket() client.connect(('192 ...

  5. 教你玩转产品管理系统iClap(PC端功能篇)

    之前和大家介绍了iClap的基础功能, 这一次针对PC端右侧的工具栏再做一个详细的介绍 随着版本的更新迭代,陆续会有更多工具和功能推出! 导航 为项目成员提供网址浏览访问导航服务,帮助项目成员快速查找 ...

  6. cf249D

    这题说的是给了一个n*m的网格,然后每个格子的点事黑色的或者是白色的然后每个点如图所示    然后只能用白点和图中给出的边建立三角形然后询问三角形的个数有多少个,这样说每个三角形的边必须是图中有的边, ...

  7. 护眼:我的DIY电脑护眼妙招

    每天对着电脑,埋头敲代码,一段时间之后.总是觉得眼睛很涩很难受,所以找到一些对抗的视疲劳的方法.不用花费任何钱,可以让眼睛享受地看着我们的屏幕,方法很简单,过来看看(小伎俩,大牛勿笑~) 一.WIN7 ...

  8. Java缓存学习之五:spring 对缓存的支持

    (注意标题,Spring对缓存的支持 这里不单单指Ehcache ) 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache ...

  9. python练习题-写一个函数,打印所有包含copy方法的内置对象

    代码: #encoding=utf-8for i in dir(__builtins__):    #print "i:",i    try: #这里的i是个字符串,并不能直接用d ...

  10. 如何禁用MySql总是定时弹出一个MySQLInstallerConsole.exe的窗口

    如何禁用MySql总是定时弹出一个MySQLInstallerConsole.exe的窗口 禁用mysql总是弹出一个安装框的定时任务这一条安装命令,Installing MySQL 5.6.21 u ...