python 优雅的使用正则表达式 ~ 1
正则表达式简介
正则表达式 , 也称谓 REs , 本质上是一个微小且高度专业化的编程语言. 他被嵌入到许多语言当中 , 例如 python 就是通过 re 模块来提供给我们使用 , 正则表达式 是通过一些规则来哦描述那些你希望匹配的字符串 .
python的 正则表达式 是通过 C语言写的 , 所以效率非常得高 ( 效率就是生命 )
python的 正则表达式 可已解决大部分的字符串匹配问题 , 但是对于有些字符串来说 , 用正则表达式 是非常费心费力的 . 所以一小部分还需要牺牲运行效率 换回开发效率
开始进入正题
大多数的匹配 是匹配自身的 , 也就是寻找已知字符串在 文本中的位置 . 但是我们有时候并不需要匹配自身 , 我们需要匹配一类字符串 , 所以这个时候 我们就要用到上面所说的用正则表达式的一些规则来 确定这一类字符串的位置 .
我们来确定这些规则的时候 会用到一些字符 , 这写字符被称为 "元字符" 就是下面的这些字符
. ^ $ * + ? { } [ ] \ | ()
正事因为这些字符 正则表达式 才和 find 方法 , 有了天壤之别 . 我们初学正则表达式 , 几乎就是学习这些字符的使用方法 .
现在开始简单的介绍一下上面元字符的基本功能和使用
[ ] : 它 可以在里面盛放一些 你可能需要匹配到的字符 举个栗子 , [abc] 可以用来匹配到 a或b或c , 其中的一个字符 . [] 还有一个强大的功能就是 里面可以 放 " - " 用于指定匹配的范围 . 例如 [a-z] 可以匹配小写字母中的任何一个字母 需要特别注意的一点是 元字符( 就是上面的那些玩意 除了 ^ ) 放到括号中 不会触发他们的特殊功能也就是 , [.^+] 会匹配 . 或 * 或 + 其中的一个字符 . 你还可以用 脱字符 " ^ " 匹配方括号之中 , 没有列出来的其它字符 . ( 网上资料说的是 [] 中所有的元字符都失效 , 但是又说 ^ 可以用 , 可能是 ^ 在 [] 失去了作为元字符本来的意义 (标注在最前端) 变成了 脱字符的意思 )
\ : 最 为奇特的 应该就是反斜杠了 , 他掌握生杀大权 , 能把原本有特权的字符 变为平民 也能将 普通的字符升为贵族 . 当元字符的前面是一 个 ' \ '的时候元字符的特殊功能会被剥夺 . 例如你需要 匹配 " . " 你可以在前面加一个 \ 来消除他的特殊功能 .
反斜杠后面也可以跟一些普通的字符用于表示特殊意义 , 例如 \w 可以匹配任何单词字符 , 相当于[a-z0-9A-Z]
\d |
匹配任何十进制数字 ; 相当于 [0-9] |
\D |
和\d相反 匹配任何非十进制数字的字符 ; 相当于 [^0-9] |
\s |
匹配任何空白字符 ( 包含空格 , 换行符 , 制表符等 ) ; 相当于[\t\n\r\f\v] |
\S |
和\s相反 , 匹配任何非空白字符 ; 相当于类[^t\n\r\v\f] |
\w |
匹配任何单词字符 [a-zA-Z] |
\W |
自己想. |
\b |
匹配单词的开始或者结束 |
\B |
... |
他们可以包含在一个字符类当中 , 并且一样拥有特殊含义 例如 [\s,.] 他将匹配任何空白字符 或 , 或 .
下面介绍一下 * 和 {}
我 们 说的这个 * 指的不是 * 的本身 (我们说过 元字符都有特殊能力) , 他跟在一个字符的后面 用于说明前一个字符 匹配 0 - 无 穷 次 . (当然也不是无穷 . 一种比喻罢了 . 实际上由于收到C语言 int 类型的限制 (为什么是C语言? 自己去前文看) 只能匹配大 概 20亿个 . )
正则表达式的默认重复规则是贪婪的 , 当你重复匹配一个 PE 时 系 统回去尽可能多的匹配 , 知道 匹配到 或者到了结尾都没有 才会退回 继续尝试 . ` 下面 我就又要举栗子 ( 栗子 : 为什么老是举我 ? 作者 : 因为你有急支糖浆呀 ! ) 现在我们说一下什么是 " 贪婪 " 先考虑以下表达式 a[bcb]*b , 首先需要匹配 'a ' 然后是 0 到多个 [bcd] 最后以 'b' 结尾 . 那么想象一下 如果 这个re匹配字符串 abcbd 会怎样 ?
步骤 | 匹配 | 说明 |
1 | a | 匹配 RE 的第一个字符 'a' |
2 | abcbd | 引擎在符合规则的情况下尽可能地匹配 [bcd]*,直到该字符串的结尾 |
3 | 失败 | 引擎尝试匹配 RE 最后一个字符 'b',但当前位置已经是字符串的结尾,所以失败告终 |
4 | abcb | 回退,所以 [bcd]* 匹配少一个字符 |
5 | 失败 | 再一次尝试匹配 RE 最后一个字符 'b',但字符串最后一个字符是 'd',所以失败告终 |
6 | abc | 再次回退,所以 [bcd]* 这次只匹配 'bc' |
7 | abcb | 再一次尝试匹配字符 'b',这一次字符串当前位置指向的字符正好是 'b',匹配成功 |
另一个 实现重复的字符是 + 用于指定前一个字符出现一次或者多次 , 前面我们说过 * 是出现 零次或多次 注意区别 . 还有一个表示重复的就是 ? 出现 0 次 或者 1 次 . 也就是不知道会不会有的时候用的.
有
的人可能有疑问了 这些我们都能用 {m,n} 来完成 为什么我们还要说这么多呢? 因为 匹配引擎对 * ? + 做了优化 所以 效率更高
为了效率我们就要讲 . 这个和 MySQL 数据库( 其他的我不了解 , 知道的少 ) 差不多 MySQL 语句大多数人喜欢 大写 就是因为
大写的话 速度会快一点 , 因为小写的语句最后也是转换成 大写执行的 . 为了这一点速度 , 程序猿们也是拼了 .
今天就到这里 , 明天会写一篇, 关于实际操作的 . 2 . 晚安 .
python 优雅的使用正则表达式 ~ 1的更多相关文章
- python 优雅的使用正则表达式 ~ 2
使用正则表达式 那些基础的理论也说了不少了现在就开始 实操 ( 不知道为啥特别喜欢这个词... ) 吧 . 上一节课说过 正则表达式也是一门语言 , 他被集成到了python当中 , 并且用 re 模 ...
- Python学习笔记013_正则表达式
Python中的正则表达式是通过 re 模块实现的. 通配符 . 表示除了换行以外的任何字符; 编写正则表达式时使用 r're' , r + 正则表达式内容 >>> impor ...
- Python标准库01 正则表达式(re包)
python正则表达式基础 简单介绍 正则表达式并不是python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大 ...
- Python3 如何优雅地使用正则表达式(详解四)
更多强大的功能 到目前为止,我们只是介绍了正则表达式的一部分功能.在这一篇中,我们会学习到一些新的元字符,然后再教大家如何使用组来获得被匹配的部分文本. 更多元字符 还有一些元字符我们没有讲到,接下来 ...
- python基础之 re(正则表达式)模块学习
今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...
- python字符串转义与正则表达式特殊字符转义
最近在自学python,字符串和正则表达式的特殊字符转义有点混淆,做个笔记简单总结一下. 1.普通字符串转义 在字符串中使用特殊字符时,要用反斜杠(\)转义字符.例如:'Let\'s go!',这里对 ...
- python爬虫之re正则表达式库
python爬虫之re正则表达式库 正则表达式是用来简洁表达一组字符串的表达式. 编译:将符合正则表达式语法的字符串转换成正则表达式特征 操作符 说明 实例 . 表示任何单个字符 [ ] 字符集,对单 ...
- python与JavaScript中正则表达式如何转换
使用python爬取网站数据的时候,总会遇到各种各样的反爬虫策略,有很大一部分都和JavaScript(以下简称为JS) 有关.在破解这些JS代码的过程中,经常会遇到模拟JS正则表达式的情况,因此,今 ...
- Python编程中 re正则表达式模块 介绍与使用教程
Python编程中 re正则表达式模块 介绍与使用教程 一.前言: 这篇文章是因为昨天写了一篇 shell script 的文章,在文章中俺大量调用多媒体素材与网址引用.这样就会有一个问题就是:随着俺 ...
随机推荐
- Disable SELinux CentOS 7
Disable SELinux CentOS 7 This blog covers the basic steps to disable SELinux on CentOS 7 first we ne ...
- 《Java程序设计》第六周学习总结
20145224 <Java程序设计>第六周学习总结 教材学习内容总结 第十章输入和输出 10.1.1 ·若要将数据从来源中取出,可以使用输入串流:若要将数据写入目的地,可以使用输出串流. ...
- 经典排序算法---冒泡排序(Bubble Sort)
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束 void Bubble ...
- CentOS 7.x安装配置
简述 VMware可以创建多个虚拟机,每个虚拟机上都可以安装各种类型的操作系统.安装方法也有很多种.下面,主要以ISO镜像安装为例,介绍CentOS 7.x的安装过程及相关的参数设置. 简述 创建虚拟 ...
- 有关Rander生成随机数的问题
首先我们说的是要生成一个随机数要求传入两个参数.一个表示生成的个数,另外一个表示生成的长度 . public void shengchengsuijishu(int lenght) { '}; Ran ...
- lrzsz在CentOS7的安装
在超级用户下打一句命令: yum install lrzsz 或者,在普通用户打一句命令,需要输入超级用户密码: sudo yum install lrzsz 然后使用Xshell 5建立连接即可
- mvc伪静态<三> IIS配置
上一篇已经已经讲述了mvc伪静态的代码实现. 下面以IIS 7.5为例演示一下IIS如何配置才能在服务器显示.html的伪静态 一.进入IIS,选择处理程序映射 二添加脚本映射 三根据你的处理程序的版 ...
- 使用PL/SQL连接远程的Oracle数据库
PL/SQL不仅可以连接本机的oracle数据库.也可以连接远程的数据库. 需要修改一个文件:在本机oracle 数据库的安装目录下找到这个文件: /oracle/ora92/network/admi ...
- 通过CoreImage生成二维码
从IOS7开始集成了二维码的生成和读取功能 生成二维码的步骤: 1.导入CoreImage框架 2.通过滤镜CIFilter生成二维码 二维码的内容(传统的条形码只能放数字): 纯文本 名片 URL ...
- Query的选择器中的通配符[id^='code']或[name^='code']
1.选择器 (1)通配符: $("input[id^='code']");//id属性以code开始的所有input标签 $("input[id$='code'] ...