正则表达式

动机
1. 处理文本成为计算机常见工作之一
2. 对文本内容的搜索提取是一项比较复杂困难的工作
3. 为了快速方便处理上述问题,正则表达式技术诞生,主键发展为一个被众多语言使用的独立技术 定义:即高级文本匹配模式,提供了搜索,替代等功能。本质是由一系列特殊符号和字符组成的子串,这个子串即是正则表达式。这个表达式描述了字符和字符的重复行为,可以匹配一类特征的字符串。 目标:
1. 熟练使用正则表达式符号
2. 正确组合和理解一般的正则表达式
3. 能够使用Python操作正则表达式 正则表达式特点
* 方便进行检索和修改
* 支持语言众多
* 灵活多样
* mongo正则类型,django等框架作为url匹配,爬虫 正则表达式的使用
Python ----》 re模块 处理正则表达式 re.findall(pattern,string)
功能 : 使用正则表达式匹配字符串
参数 : pattern 正则表达式
string 目标字符串
返回值 : 一个列表 匹配到的所有内容 元字符 (即正则表达式中有特殊含义的符号) 1. 普通字符
元字符 : abc
匹配规则 : 匹配相应的普通字符 In [6]: re.findall("abc","abcdefghabcdhig")
Out[6]: ['abc', 'abc'] 2. 或
元字符 : ab|cd
匹配规则 : 匹配|两边任意一个正则表达式符合的情况
In [7]: re.findall("ab|cd","abcdefghabcdhig")
Out[7]: ['ab', 'cd', 'ab', 'cd']
* |两侧不要有没用的空格 3. 匹配单一字符
元字符 : .
匹配规则: 匹配除了换行之外的任意字符
f.o---》 foo fao f@o In [10]: re.findall("f.o","foo is not fao")
Out[10]: ['foo', 'fao'] 4. 匹配开始位置
元字符: ^
匹配规则: 匹配一个字符串的开始位置
^Hello ---> Hello world : Hello In [14]: re.findall("^hello","hello world")
Out[14]: ['hello'] 5. 匹配结束位置
元字符: $
匹配规则:匹配目标字符串的结束位置
py$ ---> hello.py In [16]: re.findall("py$","hello.py")
Out[16]: ['py'] 6. 匹配重复
元字符 : *
匹配规则: 匹配前面的正则表达式重复0次或多次
fo* ---》 fo foo foooooooo f In [19]: re.findall("ab*","abbcdef")
Out[19]: ['abb'] 7. 匹配重复
元字符 : +
匹配规则: 匹配前面的正则表达式重复1次或多次 ab+ ---》 ab abbb abbbb
In [23]: re.findall(".+py$","hello.py")
Out[23]: ['hello.py'] 8. 匹配重复
元字符: ?
匹配规则: 匹配前面的正则表达式重复0次或1次
ab? --> a ab In [24]: re.findall("ab?","abcdefa")
Out[24]: ['ab', 'a'] 9. 匹配重复
元字符: {n}
匹配规则 : 匹配指定的重复次数
ab{3} ---> abbb
In [25]: re.findall("ab{3}","abbbbbbbb")
Out[25]: ['abbb'] 10. 匹配重复
元字符 : {m,n}
匹配规则 : 匹配前面的正则表达式重复 m次 到 n次
ab{3,5} abbb abbbb abbbbb
In [26]: re.findall("ab{2,5}","abcdabbbabbbbbb")
Out[26]: ['abbb', 'abbbbb'] 11. 匹配字符集合
元字符: []
匹配规则 : 匹配括号范围内的任意一个字符
[abc123d] a b c 1 2 3 d
[a-z]
[A-Z]
[0-9]
[123a-zA-Z]
In [31]: re.findall("[_0-9a-zA-Z]","Hello world 123") 12. 匹配字符集合
元字符: [^...]
匹配规则 : 匹配除指定字符集之外的任意字符 In [34]: re.findall("[^abc]","nihao abc")
Out[34]: ['n', 'i', 'h', 'o', ' '] 13. 匹配任意(非)数字字符
元字符: \d \D
匹配规则 : \d 匹配任意数字字符 \D 匹配任意非数字字符
[0-9] [^0-9] In [35]: re.findall("1\d{10}","17611665537")
Out[35]: ['17611665537'] 14. 匹配(非)普通字符 (普通字符: 数字字母下划线)
元字符 : \w \W
匹配规则: \w 匹配任意一个普通字符 \W匹配任意非普通字符
[_0-9a-zA-Z] [^_0-9a-zA-Z] In [39]: re.findall("\w+","hello$1")
Out[39]: ['hello', '1'] In [40]: re.findall("\W+","hello$1")
Out[40]: ['$'] 15. 匹配(非)空字符
元字符 : \s \S
匹配规则:\s 匹配任意空字符 \S 匹配任意非空字符
[ \n\t\r] In [45]: re.findall("\s",'hello world\r\n\t\0')
Out[45]: [' ', '\r', '\n', '\t'] 16. 匹配起止位置
元字符: \A \Z
匹配规则 : \A匹配开始位置 \Z匹配结束位置
^ $
绝对匹配 \Aabc\Z ----> abc (且字符串只是abc) In [48]: re.findall("\A/\w+/\w+\Z",'/football/zhongchao')
Out[48]: ['/football/zhongchao'] 17. 匹配(非)单词边界位置
元字符: \b \B
匹配规则 : \b 匹配单词的边界 \B匹配非单词的边界 单词边界 : 数字字母下划线和其他字符的交界位置为单词的边界 abc_1 haha In [55]: re.findall(r"\Bis\b",'This is a test')
Out[55]: ['is'] 元字符总结 匹配单个字符:a . \d \D \w \W \s \S [...] [^...]
匹配重复性 : * + ? {N} {m,n}
匹配某个位置 : ^ $ \A \Z \b \B
其他 : | () \ 练习
匹配长度8-10位的密码 必须以数字开头,数字字母下划线组成
^[0-9]\w{7,9}$ 转义字符 正则表达式特殊符号 :
. * ? $ '' "" [] {} () \ ^
如果想匹配特殊符号则加转义 \"\.\" -----> "." r ---> raw 原生字符串 : 不进行转义 In [64]: re.findall(r"\bis",'This is')
Out[64]: ['is'] 贪婪和非贪婪 正则表达式默认的重复匹配模式 : 贪婪模式
尽可能多的向后匹配 * + ? {m,n} 这四种情况下会产生贪婪模式 非贪婪模式 : 尽可能少的匹配内容,满足正则表达式含义即可 贪婪---》非贪婪 *? +? ?? {m,n}? In [70]: re.findall("ab*?",'abbbbbbbbcded')
Out[70]: ['a'] In [71]: re.findall("ab+?",'abbbbbbbbcded')
Out[71]: ['ab'] 正则表达式分组 使用()可以为一个正则表达式建立一个子组,子组可以看做内部的整体
abcdef ----》 http://www.baidu.com 子组的作用
1. 增加子组后对正则表达式整体的匹配内容没有影响
2. 子组可以改变重复元字符的重复行为
3. 子组在某些操作中可以对子组匹配内容单独提取 子组的注意事项
1.每个正则表达式可以有多个子组,由外到内由左到右为第一第二。。。。子组
2.子组通常不要交叉 捕获组和非捕获组(命名组和非命名组)
子组命名格式
(?P<name>abc)
1.很多编程接口可以直接通过名字获取子组匹配内容
2.捕获组中的正则表达式可以通过名字重复调用
(?P=name) (?P<dog>ab)cdef(?P=dog) -----> abcdefab In [83]: re.search('(ab)+','ababababab').group()
Out[83]: 'ababababab' In [84]: re.search('(?P<dog>ab)cdef(?P=dog)','abcdefabcde').group()
Out[84]: 'abcdefab' 匹配身份证号
\d{17}(\d|x) re模块 obj = compile(pattern,flags = 0)
功能: 获取正则表达式对象
参数: pattern : 正则表达式
flags: 功能标志位,提供更丰富的匹配
返回值 : 正则表达式对象 re模块和compile对象均有的函数 obj.findall(string,pos,endpos)
功能 : 通过正则表达式匹配字符串
参数 : string 目标字符串
pos 目标字符串的匹配开始位置
endpos 目标字符串的结束位置
返回值 : 匹配到的所有内容以列表返回 * 如果正则表达式有子组则只显示子组匹配内容 obj.split(string)
功能 : 按照正则表达式切割目标字符串
参数 : 目标字符串
返回值 : 切割后的内容 obj.sub(replaceStr,string,max)
功能: 替换正则表达式匹配到的内容
参数: replaceStr 要替换的内容
string 目标字符串
max 最多替换几处
返回值 : 返回替换后的字符串 subn(repl,string,count)
功能: 替换正则表达式匹配到的内容
参数: repl 要替换的内容
string 目标字符串
count 最多替换几处
返回值 : 返回替换后的字符串和实际替换的个数 re.finditer(pattern,string)
功能 : 使用正则表达式匹配目标内容
参数 : 目标字符串
返回值 : 迭代对象 迭代的每个内容为一个match对象 re.match(pattern,string)
功能 : 匹配一个字符串的开头
参数 : 目标字符串
返回值 : 如果匹配到返回 match obj
没有匹配到返回 None re.search(pattern,string)
功能 : 匹配一个字符串
参数 : 目标字符串
返回值 : 如果匹配到返回 match obj
没有匹配到返回 None
* match 只能匹配字符串的开头位置,search可以匹配任意位置,但是也只能匹配一处
* 通常match对象调用其属性时往往需要try异常处理 fullmatch()
要求目标字符串完全匹配 compile 对象特有属性(re模块没有)
flags : 标志位
pattern : 正则表达式
groupindex : 捕获组形成的字典
groups : 多少个子组 match 对象属性方法 print(match_obj.pos) #目标字符串开头位置
print(match_obj.endpos) # 目标字符串结束位置
print(match_obj.re) # 正则表达式对象
print(match_obj.string) # 目标字符串
print(match_obj.lastgroup) # 最后一组的名字
print(match_obj.lastindex) # 最后一组是第几组 span() 匹配到内容的起止位置
start() 匹配到内容的开始位置
end() 匹配到内容的结束位置 group(n)
功能 : 获取match 对象匹配的内容
参数 : 默认为0 表示获取正则整体的匹配内容
如果传入大于0的正数则表示获取对应子组匹配内容
返回值:返回匹配到的内容 groups()
功能 : 得到所有子组匹配的内容 groupdict()
功能 :得到所有捕获组匹配的内容 作业 : 读取一个文件的内容 ,将文件中所有的以大写字母开头的单词匹配出来

regex正则表达式学习的更多相关文章

  1. RegEx正则表达式学习笔记

    一.实用的例子 public static void main(String[] args) { // 简单练习 System.out.println("-123".matches ...

  2. Python正则表达式学习摘要及资料

    摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2 ...

  3. Python 正则表达式学习

    摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2, ...

  4. Python 正则表达式学习摘要及资料

    来源:Michael_翔_ 摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会 ...

  5. javascript正则表达式 - 学习笔记

    JavaScript 正则表达式 学习笔记 标签(空格分隔): 基础 JavaScript 正则表达式是用于匹配字符串中字符组合的模式.在javascript中,正则表达式也是对象.这些模式被用于Re ...

  6. 小菜鸡学习---<正则表达式学习笔记2>

    正则表达式学习笔记2 一.修饰符 前面我们学习的都是用于匹配的基本的关键的一些表达式符号,现在我们来学习修饰符.修饰符不写在正则表达式里,修饰符位于表达式之外,比如/runoob/g,这个最后的g就是 ...

  7. 深入浅出的javascript的正则表达式学习教程

    深入浅出的javascript的正则表达式学习教程 阅读目录 了解正则表达式的方法 了解正则中的普通字符 了解正则中的方括号[]的含义 理解javascript中的元字符 RegExp特殊字符中的需要 ...

  8. 转:C++ Boost/tr1 Regex(正则表达式)快速指南

    C++ Boost/tr1 Regex(正则表达式)快速指南 正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分. 本文以Boost 1.39正则表达式为基础,应该广泛适 ...

  9. JavaScript正则表达式学习笔记(二) - 打怪升级

    本文接上篇,基础部分相对薄弱的同学请移步<JavaScript正则表达式学习笔记(一) - 理论基础>.上文介绍了8种JavaScript正则表达式的属性,本文还会追加介绍几种JavaSc ...

随机推荐

  1. Spring中的接口BeanFactory和FactoryBean的学习

    BeanFactory: 相当于对象工厂,可以获取对象的实例以及相应的属性.BeanFactory定义了IOC容器的最基本形式,并提供了IOC容器应遵守的的最基本的接口,也就是Spring IOC所遵 ...

  2. 7.STM32中GPIO理解

    端口概述 在STM32中,每个I/O端口可以由软件配置成为输入/输出模式.复位期间或刚复位后,I/O端口被配置成浮空输入模式.所有的GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时, 它们可以被激 ...

  3. ajaxFileUpload 文件上传

    源码: jQuery .extend({ createUploadIframe : function(id, uri) {//id为当前系统时间字符串,uri是外部传入的json对象的一个参数 //c ...

  4. Mybatis常见疑问

    1.在连接数据库时候,mysql是否支持fetchsize分页获取? 满足以下几个条件,可以使用fetchsize,根据游标获得记录 ①MySQL 从5.0.2开始支持分页获得. ②同时需要在jdbc ...

  5. 学习笔记——Ubuntu下使用Docker包部署禅道任务管理系统

    写此文目的:利用搭建禅道环境联系Docker基本使用方法,加深对Docker容器的理解,Ubuntu下面才能原生运行Docker,因此选择了Ubuntu 1.下载禅道开源版 wget http://d ...

  6. let const区别!

    这次做项目在申明变量的时候用到let const 总结下这两个区别 : 首先 let与const都是只在声明所在的块级作用域内有效. let声明的变量可以改变,值和类型都可以改变,没有限制.const ...

  7. lvm再次学习

    目录 LVM构架 分区 pvcreat vgcreat lvcreat 格式化文件系统 挂载至目录 已经学过很多很多遍LVM了,每次都觉得自己学会了,每次都是得查询才能搞定,这次给LVM做个专题,在有 ...

  8. 基础总结(04)-- display:none;&&visibility:hidden;区别

    display:none 1.使元素隐藏,不再占据空间. 2.动态操作时会引起页面回流和重绘,影响性能. 3.子元素也会被隐藏并且添加display:block/visibility:visible无 ...

  9. JAVA正则表达式匹配,替换,查找,切割(转)

    import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public c ...

  10. 【转载】Google 程序员消灭 Bug 的 5 大法宝!

    遇到问题怎么办?还能怎么办,解决呗.那到底怎么解决呢?你是有什么惯用的逻辑模式.解决策略,还是全靠直觉手感? 本文中,一位 Google 程序员将“现场”演示其解决编程问题的始末,看看有套路的问题解决 ...