python零碎知识(5):有关正则表达式

一、前言

推荐几篇相关博文
 1.http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
 2.http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html
可以学习参考

二、我对python正则表达式的认识regular expression (RegExp)

 1 ^:匹配字符串的开始.

 2 $:匹配字符串的结尾。

 3 \b:匹配一个单词的边界

 4 \d:匹配任意数字

 5 \D:匹配任意非数字字符

 6 x?:匹配一个可选的x字符(换句话说,它匹配1次或者0次x 字符)。 

 7 x*:匹配0次或者多次x字符

 8 x+:匹配1次或者多次x字符。

 9 x{n,m}: 匹配x字符,至少n次,至多m次

10 {a|b|c}:要么匹配a,要么匹配b,要么匹配c。

11 (x):一般情况下表示一个记忆组(remembered group). 
你可以利用re.search函数返回对象的groups()函数获取它的值。 

 

三、罗马字母

在罗马数字中,利用7个不同字母进行重复或者组合来表达各式各样的数字。

1 I = 1 

2 V = 5 

3 X = 10 

4 L = 50 

5 C = 100 

6 D = 500 

7 M = 1000 

构造罗马数字的一些规则:
1.字符是叠加的。
I表示1, II表示2, 而III表示3. VI 表示 6 (字面上为逐字符相加, “51”), VII 表示 7, VIII 表示 8.

2.能够被10整除的字符(I, X, C, 和 M)至多可以重复三次.
 对于4, 你则需要利用下一个最大的能够被5整除的字符进行减操作得到,你不能把4 表示成 IIII(因为能够被10整除的字符(I,X,C,M)最多能重复三次);而应表示为 IV (比“51”)。数字40写成XL (比5010),41 写成 XLI,42 写成 XLII, 43 写成 XLIII;而 44 写成 XLIV (比5010, 然后比51).
类似的,对于数字 9,你必须利用下一个能够被10整除的字符进行减操作得到: 8 表示为 VIII, 而 9 则表示为 IX (比101), 而不是 VIIII (因为字符I 不能连续重复四次)。数字90 表示为 XC, 900 表示为 CM.

3.被5整除的字符不能重复(V,L,D)
数字10 常表示为X, 而从来不用VV来表示。数字100常表示为C, 也从来不表示为 LL.

4.罗马数字经常从高位到低位书写,从左到右阅读,因此不同顺序的字符意义大不相同
DC 表示 600; 而CD 是一个完全不同的数字(为400, 也就是比500100). CI 表示 101; 而IC 甚至不是一个合法的罗马字母(因为你不能直接从数字100减去1; 比需要写成XCIX, 意思是 比10010, 然后加上数字9,也就是比 101的数字).

四、利用罗马字母来校验

1.目标:校验任意一个字符串是否为一个有效的罗马数字
2.思想:
  (1).一定要熟练正则表达式,才能对于下面的校验熟练掌握
  (2).根据罗马字母的匹配规则,由于罗马数字经常是从高位到低位书写,我们从高位开始:千位。对于大于、等于1000的数字,千位有一系列的字符 M 表示。
3.流程:
Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。
4.用途:很广泛、很强大

还是引用 Dive Into Python上的实例吧,加深下理解。谁叫我还是菜鸟呢!

NO1:校验千位

 1 import re

 2 pattern='^M?M?M?$'

 3 #语法:re.search(pattern, string, flags)

 4 print re.search(pattern, 'M')

 5 print re.search(pattern,'MM')

 6 print re.search(pattern,'MMM')

 7 print re.search(pattern,'MMMM')

 8 print re.search(pattern,'')

 9 输出如下:

10 <_sre.SRE_Match object at 0x00AEDC60>

11 <_sre.SRE_Match object at 0x00AEDC60>

12 <_sre.SRE_Match object at 0x00AEDC60>

13 None

14 <_sre.SRE_Match object at 0x00AEDC60>

分析:
1.模式分析:

(1):^表示仅仅在一个字符串的开始匹配其后的字符串内容。如果没有这个字符,这个模式将匹配出现在字符串任意位置上的 M,而这并不是你想要的。你想确认的是:字符串中是否出现字符M,如果出现,则必须是在字符串的开始。

(2):M? 可选的匹配单个字符M,由于他重复出现三次,你可以在一行中匹配0次到3次字符M

(3):$ 字符限制模式只能够在一个字符串的结尾匹配。当和模式开头的字符^结合使用时,这意味着模式必须匹配整个串,并且在在字符M的前后都不能够出现其他的任意字符。

2.功能分析:

(1):re 模块的本质是一个search 函数,该函数有两个参数,一个是正则表达式(pattern),一个是字符串 ('M'),函数试图匹配正则表达式。如果发现一个匹配,search 函数返回一个拥有多种方法可以描述这个匹配的对象,如果没有发现匹配,search 函数返回一个None, 一个Python 空值(null value)。你此刻关注的唯一事情,就是模式是否匹配上,可以利用 search函数的返回值弄清这个事实。字符串'M' 匹配上这个正则表达式,因为第一个可选的M匹配上,而第二个和第三个M 被忽略掉了。

(2):'MM' 匹配上是因为第一和第二个可选的M匹配上,而忽略掉第三个M

(3):'MMM' 匹配上因为三个M 都匹配上了

(4):'MMMM' 没有匹配上。因为所有的三个M都匹配上,但是正则表达式还有字符串尾部的限制 (由于字符 $), 然而字符串没有结束(因为还有第四个M字符), 因此 search 函数返回一个None.

(5):有趣的是,一个空字符串也能够匹配这个正则表达式,因为所有的字符 M 都是可选的。

NO2.检验百位数

……头疼,正在思考中

你可能感兴趣的:(python)