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模块)的更多相关文章

  1. python正则表达式之re模块方法介绍

    python正则表达式之re模块其他方法 1:search(pattern,string,flags=0) 在一个字符串中查找匹配 2:findall(pattern,string,flags=0) ...

  2. Python正则表达式与re模块介绍

    Python中通过re模块实现了正则表达式的功能.re模块提供了一些根据正则表达式进行查找.替换.分隔字符串的函数.本文主要介绍正则表达式先关内容以及re模块中常用的函数和函数常用场景. 正则表达式基 ...

  3. python 正则表达式 (重点) re模块

    京东的注册页面,打开页面我们就看到这些要求输入个人信息的提示.假如我们随意的在手机号码这一栏输入一个11111111111,它会提示我们格式有误.这个功能是怎么实现的呢?假如现在你用python写一段 ...

  4. Python正则表达式与hashlib模块

    菜鸟学python第十六天 1.re模块(正则表达式) 什么是正则表达式 正则表达式是一个由特殊字符组成的序列,他能帮助对字符串的某种对应模式进行查找. 在python中,re 模块使其拥有全部的正则 ...

  5. python正则表达式与re模块-02

    正则表达式 正则表达式与python的关系 # 正则表达式不是Python独有的,它是一门独立的技术,所有的编程语言都可以使用正则 # 但要在python中使用正则表达式,就必须依赖于python内置 ...

  6. python 正则表达式re使用模块(match()、search()和compile())

    摘录 python核心编程 python的re模块允许多线程共享一个已编译的正则表达式对象,也支持命名子组.下表是常见的正则表达式属性: 函数/方法 描述 仅仅是re模块函数 compile(patt ...

  7. Python正则表达式与re模块

    在线正则表达式测试 http://tool.oschina.net/regex/ 常见匹配模式 模式 描述 \w 匹配字母数字及下划线 \W 匹配非字母数字下划线 \s 匹配任意空白字符,等价于 [\ ...

  8. python 正则表达式与re模块

    一.正则表达式 用途 用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. #### 简单地说 就是用于字符串匹配的 字符组 在 ...

  9. [ python ] 正则表达式及re模块

    正则表达式 正则表达式描述: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个‘规则字符串’,这个‘规则字符串’用来    表达对字符串的一种过滤 ...

  10. Python 正则表达式、re模块

    一.正则表达式 对字符串的操作的需求几乎无处不在,比如网站注册时输入的手机号.邮箱判断是否合法.虽然可以使用python中的字符串内置函数,但是操作起来非常麻烦,代码冗余不利于重复使用. 正则表达式是 ...

随机推荐

  1. VC 2010的重大变化

    auto 关键字具有新的默认含义.由于使用旧含义的情况很少见,因此大多数应用程序都不会受此更改影响. 引入了新的 static_assert 关键字,如果代码中已经存在具有某个名称的标识符,则此关键字 ...

  2. mysql隔离级别

    MySQL/InnoDB定义的4种隔离级别: Read Uncommited 可以读取未提交记录. Read Committed (RC) 针对当前读,RC隔离级别保证对读取到的记录加锁 (记录锁), ...

  3. Git Tips

    撤销已经推送到远程仓库的最后一次提交,要小心这么操作,因为远程仓库还有别人在使用 $ git reset --hard HEAD^ $ git push -f origin master 从仓库中提出 ...

  4. Swift 集合类型

     Swift语言提供数组和字典的集合类型  Swift 语言里的数组和字典中存储的数据值类型必须明确 ,即数组中只能存放同类型的数据. 1: 数组 数组的创建 var shoppingList: St ...

  5. java之接口interface

    接口 1.多个无关的类可以实现同一个接口 2.一个类可以实现多个无关的接口 3.与继承关系类似,接口与实现类之间存在多态性 4.定义java类的语法格式 < modifier> class ...

  6. 让mingw gdb支持STL,并自动load .gdbinit

    环境要求:python (2.7版本可以,3.x没测过),mingw官方版(你可能已经有了),gdb2013-02-04(到这里https://code.google.com/p/qp-gcc/dow ...

  7. Canvas现实画板功能

    先看图片 HTML <!doctype html> <html lang="en"> <head> <meta charset=" ...

  8. viewWithTag获取subview规则详解

    通常我们在view层级里面对subView的操作可以通过两种方式:1.保留一个subview的引用,然后在类中通过该引用对该subview进行操作,但是要注意在适当的位置添加内存维护的代码,退出前手动 ...

  9. 基于SWFUpload的angular上传组件

    回顾 由于工作内容比较多,特别是架构方面,需要耗费很多的时间调整.重构,因此很久没有写文章了. 话就不多说了,直接进入主题. 实现 首先分析一下SWFUpload初始化的时候,需要传入当前触发上传的元 ...

  10. Guardian of Decency(二分图)

    Guardian of Decency Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submi ...