一、前言
推薦幾篇相關博文
1.http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
2.http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html
可以學習參考
二、我對pythonRegex的認識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 (字面上為逐字元相加, “5 加 1”), VII 表示 7, VIII 表示 8.
2.能夠被10整除的字元(I, X, C, 和 M)至多可以重複三次.
對於4, 你則需要利用下一個最大的能夠被5整除的字元進行減操作得到,你不能把4 表示成 IIII(因為能夠被10整除的字元(I,X,C,M)最多能重複三次);而應表示為 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), 而不是 VIIII (因為字元I 不能連續重複四次)。數字90 表示為 XC, 900 表示為 CM.
3.被5整除的字元不能重複(V,L,D)
數字10 常表示為X, 而從來不用VV來表示。數字100常表示為C, 也從來不表示為 LL.
4.羅馬數字經常從高位到低位書寫,從左至右閱讀,因此不同順序的字元意義大不相同
DC 表示 600; 而CD 是一個完全不同的數字(為400, 也就是比500 小100). CI 表示 101; 而IC 甚至不是一個合法的羅馬字母(因為你不能直接從數字100減去1; 比需要寫成XCIX, 意思是 比100 小10, 然後加上數字9,也就是比 10小1的數字).
四、利用羅馬字母來校正
1.目標:校正任意一個字串是否為一個有效羅馬數字
2.思想:
(1).一定要熟練Regex,才能對於下面的校正熟練掌握
(2).根據羅馬字母的匹配規則,由於羅馬數字經常是從高位到低位書寫,我們從高位開始:千位。對於大於、等於1000的數字,千位有一系列的字元 M 表示。
3.流程:
Python通過re模組提供對Regex的支援。使用re的一般步驟是先將Regex的字串形式編譯為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 None14 <_sre.SRE_Match object at 0x00AEDC60>
分析:
1.模式分析:
(1):^表示僅僅在一個字串的開始匹配其後的字串內容。如果沒有這個字元,這個模式將匹配出現在字串任意位置上的 M,而這並不是你想要的。你想確認的是:字串中是否出現字元M,如果出現,則必須是在字串的開始。
(2):M? 可選的匹配單個字元M,由於他重複出現三次,你可以在一行中匹配0次到3次字元M。
(3):$ 字元限制模式只能夠在一個字串的結尾匹配。當和模式開頭的字元^結合使用時,這意味著模式必須匹配整個串,並且在在字元M的前後都不能夠出現其他的任一字元。
2.功能分析:
(1):re 模組的本質是一個search 函數,該函數有兩個參數,一個是Regex(pattern),一個是字串 ('M'),函數試圖匹配Regex。如果發現一個匹配,search 函數返回一個擁有多種方法可以描述這個匹配的對象,如果沒有發現匹配,search 函數返回一個None, 一個Python 空值(null value)。你此刻關注的唯一事情,就是模式是否匹配上,可以利用 search函數的傳回值弄清這個事實。字串'M' 匹配上這個Regex,因為第一個可選的M匹配上,而第二個和第三個M 被忽略掉了。
(2):'MM' 匹配上是因為第一和第二個可選的M匹配上,而忽略掉第三個M。
(3):'MMM' 匹配上因為三個M 都匹配上了
(4):'MMMM' 沒有匹配上。因為所有的三個M都匹配上,但是Regex還有字串尾部的限制 (由於字元 $), 然而字串沒有結束(因為還有第四個M字元), 因此 search 函數返回一個None.
(5):有趣的是,一個Null 字元串也能夠匹配這個Regex,因為所有的字元 M 都是可選的。
NO2.檢驗百位元
……頭疼,正在思考中