Python正则表达式模块(re模块)
Python是我接触到的第一门编程语言,虽然它足够简单,但是对于当时刚刚接触编程语言的我来说还是有些难度的,于是只是了解了一些Python的基本语法,稍微深入一点的地方都没怎么了解。不过,到现在为止,我已经接触了这门编程语言一年了,期间把Python各种特性,各种包都看过,了解过。不过对于正则表达式这块仍然一知半解,加上前段时间帮助聪哥整理了<深入Python3>的中文维护版,凑上这个国庆假期,于是来简单的聊一聊这个正则表达式模块--re。
首先是字符串中字符的替换问题,如果使用原生的Python方法,一般就是采用 replace 方法,下面我们采用re.sub方法同它进行比较。
第一个案例:我们的目标是把ROAD替换成RD.

似乎replace方法工作的不错阿,完成了我给定的任务。如果是下面这个例子呢?

这里很明显已经出现了问题,因为这个字符串中含有BROAD,其中也有ROAD四个字符,但是我们的目标并没有要求替换它。这里它也被替换成了BRD. ,这已经足以说明replace方法的局限性。当然,如果我们设计得当,这个方法也能用。

使用切片,我们也能做到这一点,仅仅把最后面的四个字符替换。不过,这种算法也有局限性,如果我们要将STREET 替换为ST. ,我们是不是应该保留最后面的六个字符?这样,每次替换都要修改代码,并且很容易造成错误,对于调试来说很麻烦。
那么让我们来试一下re.sub方法。

注意第一个参数,‘ROAD$’,其中美元符代表了字符串的结尾,也就是说匹配结尾的ROAD字符。同样的 ,^ 代表字符串的开头。我很快发现, 有时候ROAD不一定在字符串的结尾,比如: s = '100 BROAD ROAD APT.3',此时,上面的方法就不适用了,没关系,我们还有\b。

是不是很神奇?\b在左侧意味着左侧是个空格,在右侧意味着右侧是个空格,因此两侧\b就是说,ROAD是一个独立的单词。也就是把独立的ROAD换成RD.,这和我们的目标相同。
第二个案例:罗马数字的匹配
在罗马数字中,用七个字母组合来表示数字。
I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000
下面是几个通常的规则来构成罗马数字:
大部分时候用字符相叠加来表示数字。I是1, II是2, III是3。VI是6(挨个看来,是“5 和 1”的组合),VII是7,VIII是8。
含有10的字符(I,X,C和M)最多可以重复出现三个。为了表示4,必须用同一位数的下一个更大的数字5来减去一。不能用IIII来表示4,而应该是IV(意思是比5小1)。40写做XL(比50小10),41写做XLI,42写做XLII,43写做XLIII,44写做XLIV(比50小10并且比5小1)。
有些时候表示方法恰恰相反。为了表示一个中间的数字,需要从一个最终的值来减。比如:9需要从10来减:8是VIII,但9确是IX(比10小1),并不是VIII(I字符不能重复4次)。90是XC,900是CM。
表示5的字符不能在一个数字中重复出现。10只能用X表示,不能用VV表示。100只能用C表示,而不是LL。
罗马数字是从左到右来计算,因此字符的顺序非常重要。DC表示600,而CD完全是另一个数字400(比500小100)。CI是101,IC不是一个罗马数字(因为你不能从100减1,你只能写成XCIX,表示比100小10,且比10小1)。
对于千位数的匹配:

我们设定匹配模式是三个M,其中‘?’代表了这个参数是可选的,即三个可选的M参数。
第一次匹配M时,从^(字符串开头)开始匹配,匹配到一个M,另外两个由于是可选的,因此跳过,然后匹配到$(字符串结尾),匹配完成,返回一个匹配对象。第二,第三次匹配军成功。第四次匹配时,由于最多只能匹配上三个M,而给了四个M,因此在匹配完三个M时寻找$时,寻找不到,因此匹配失败,返回None。
值得注意的时,因为三个参数都是可选的,因此空字符串也能匹配上。
对于百位数的匹配:
100 = C
200 = CC
300 = CCC
400 = CD
500 = D
600 = DC
700 = DCC
800 = DCCC
900 = CM
因此有以下四种匹配模式:
CM
CD
可能有0到3个字符C(0个表示千位为0)。
D紧跟在0到3个字符C的后面。
其中后两种可以合并为一种:
一个可选的D,后面跟着0到3个字符C。

此时,匹配模式中即包含千位,也包含百位。 ‘|’就是逻辑运算中或的意思,当出现几种情况并行时使用,当其中一个条件满足时,就停止执行后面的条件。
同样可以发现,空字符也是可以被匹配上的。
同理,我们分析了十位和个位的法则,也可以匹配上。
正则表达式非常强大,但它也并不是解决每一个问题的正确答案。你需要更多的了解来判断哪些情况适合使用正则表达式。某些时候它可以解决你的问题,某些时候它可能带来更多的问题。
预留问题:
1.“115.28.66.99[port=8080]”,这个字符串表示IP地址为115.28.66.99的服务器的8080端口是打开的,请用程序解析此字符串,然后打印出“IP地址为***的服务器的***端口是打开的”。
2.“115.28.66.99[port=21,type=ftp]”,这个字符串表示IP地址为115.28.66.99的服务器的21端口提供的是ftp服务,其中如果“,type=ftp”部分被省略,则默认为http服务。请用程序解析此字符串,然后打印出“IP地址为***的服务器的***端口提供的服务为***”
Python正则表达式模块(re模块)的更多相关文章
- python正则表达式之re模块方法介绍
python正则表达式之re模块其他方法 1:search(pattern,string,flags=0) 在一个字符串中查找匹配 2:findall(pattern,string,flags=0) ...
- Python正则表达式与re模块介绍
Python中通过re模块实现了正则表达式的功能.re模块提供了一些根据正则表达式进行查找.替换.分隔字符串的函数.本文主要介绍正则表达式先关内容以及re模块中常用的函数和函数常用场景. 正则表达式基 ...
- python 正则表达式 (重点) re模块
京东的注册页面,打开页面我们就看到这些要求输入个人信息的提示.假如我们随意的在手机号码这一栏输入一个11111111111,它会提示我们格式有误.这个功能是怎么实现的呢?假如现在你用python写一段 ...
- Python正则表达式与hashlib模块
菜鸟学python第十六天 1.re模块(正则表达式) 什么是正则表达式 正则表达式是一个由特殊字符组成的序列,他能帮助对字符串的某种对应模式进行查找. 在python中,re 模块使其拥有全部的正则 ...
- python正则表达式与re模块-02
正则表达式 正则表达式与python的关系 # 正则表达式不是Python独有的,它是一门独立的技术,所有的编程语言都可以使用正则 # 但要在python中使用正则表达式,就必须依赖于python内置 ...
- python 正则表达式re使用模块(match()、search()和compile())
摘录 python核心编程 python的re模块允许多线程共享一个已编译的正则表达式对象,也支持命名子组.下表是常见的正则表达式属性: 函数/方法 描述 仅仅是re模块函数 compile(patt ...
- Python正则表达式与re模块
在线正则表达式测试 http://tool.oschina.net/regex/ 常见匹配模式 模式 描述 \w 匹配字母数字及下划线 \W 匹配非字母数字下划线 \s 匹配任意空白字符,等价于 [\ ...
- python 正则表达式与re模块
一.正则表达式 用途 用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. #### 简单地说 就是用于字符串匹配的 字符组 在 ...
- [ python ] 正则表达式及re模块
正则表达式 正则表达式描述: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个‘规则字符串’,这个‘规则字符串’用来 表达对字符串的一种过滤 ...
- Python 正则表达式、re模块
一.正则表达式 对字符串的操作的需求几乎无处不在,比如网站注册时输入的手机号.邮箱判断是否合法.虽然可以使用python中的字符串内置函数,但是操作起来非常麻烦,代码冗余不利于重复使用. 正则表达式是 ...
随机推荐
- Exists 比Contains 慢非常多。
void Main() { List<string> s = new List<string>(){}; for(int i=0;i<10000;i++) { s.Add ...
- 最近一直在搞CAE,发现Eplan p8真的好强大。
最近一直在搞CAE,发现Eplan p8真的好强大. 标准化的意义在与提高工作效率,减少重复. 标准化后,不容易出错,项目更改容易.事件都能及时跟踪.
- hadoop 转
detailed http://wenku.baidu.com/view/c2d1ebb4ba0d4a7302763a84.html http://hadoop.apache.org/docs/r1. ...
- EventBus使用介绍
EventBus是Android下高效的发布/订阅事件总线机制.作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程 ...
- Android working with Volley
Volley是google官方推出的一个开源网络访问库,在项目中直接使用它,而不需要写一大堆的重复的代码; 项目主页: https://android.googlesource.com/platfor ...
- Codeforces Round #197 (Div. 2) (A、B、C、D、E五题合集)
A. Helpful Maths 题目大意 给一个连加计算式,只包含数字 1.2.3,要求重新排序,使得连加的数字从小到大 做法分析 把所有的数字记录下来,从小到大排序输出即可 参考代码 #inclu ...
- [转]make: 警告:检测到时钟错误。您的创建可能是不完整的。
转自http://blog.csdn.net/maopig/article/details/6599660 我在make的时候也出现了同样的问题,不过不是什么大问题,这个不影响编译结果 分析原因可能是 ...
- smartjs - DataManager API
dataServices 数据服务的管理器:首先看下具体的代码 //数据服务 dataServices = st.factory({ name: "dataServices", p ...
- MyBatis知多少(2)
MyBatis从目前最流行的关系数据库访问方法中吸收了大量的优秀特征和思想,并找出其中的协同增效作用.下图展示了MyBatis框架是如何吸收我们在多年使用不同方式进行数据库集成的 开发过程中所学到的知 ...
- AssetBundle系列——场景资源之打包(一)
本篇讲解的是3D游戏的场景资源打包方式,首先简单的分析一下场景中所包含的资源的类型. 场景资源一般包含:地表模型(或者是Unity Terrain),非实例化物体(摄像机.空气墙.光源.各种逻辑物体之 ...