清晰透明的Python語(yǔ)言說(shuō)明
Python語(yǔ)言是一種清晰的語(yǔ)言的另一個(gè)意思是,它的作者有意的設(shè)計(jì)限制性很強(qiáng)的語(yǔ)法,使得不好的編程習(xí)慣(例如if語(yǔ)句的下一行不向右縮進(jìn))都不能通過(guò)編譯。
前面說(shuō)過(guò)“.”通常用作元字符,但在字符集合里,其特殊性將被剝奪,恢復(fù)成普通字符。這一點(diǎn)讀者可以自己改動(dòng)一下上面的代碼來(lái)實(shí)驗(yàn)一下。有時(shí)需要查找不屬于某個(gè)字符集合的字符。比如想查找除了數(shù)字6以外,其它任意字符都行的情況,這時(shí)需要用到反義。
其做法是把元字符“^”作為集合的首個(gè)字符,例如,[^5] 將匹配除“6”之外的任意字符。反斜杠“\”是一種非常重要的元字符。我們知道在Python的字符串中,反斜杠也是作為一種特殊字符(或轉(zhuǎn)義字符)使用,后面可以跟不同的字符以表示不同特殊意義;
它也可以用于取消所有的元字符,這樣你就可以在模式中匹配它們了。舉個(gè)例子,如果你需要匹配字符“\”,你可以在其之前用反斜杠來(lái)取消它們的特殊意義:\\。下面是一些用“\”跟其他字符復(fù)合而成的元字符,它們通常表示一些預(yù)定義的字符集,如下所示:
我們已經(jīng)講過(guò)為單個(gè)字符指定重復(fù)次數(shù)的方法——直接在字符后面加上限定符就行了;現(xiàn)在我們?cè)賮?lái)學(xué)習(xí)一下重復(fù)多個(gè)字符的八法:你可以用小括號(hào)來(lái)指定子表達(dá)式(也叫做分組)。
然后你就可以指定這個(gè)子表達(dá)式的重復(fù)次數(shù)了,你也可以對(duì)子表達(dá)式進(jìn)行其它一些操作。我們知道,IP地址是由點(diǎn)號(hào)分隔的四個(gè)數(shù)字,并且每個(gè)數(shù)字都不能大于255。(\d{1,3}\.){3}\d{1,3}是一個(gè)簡(jiǎn)單的IP地址匹配表達(dá)式。
其中:\d{1,3}匹配1到3位的數(shù)字,(\d{1,3}\.){3}匹配三位數(shù)字加上一個(gè)英文句號(hào)(這個(gè)整體也就是這個(gè)分組)重復(fù)3次,最后再加上一個(gè)一到三位的數(shù)字(\d{1,3})。然而,它也將匹配256.300.888.999這種不可能存在的IP地址。如果能使用算術(shù)比較的話,或許能簡(jiǎn)單地解決這個(gè)問(wèn)題,但是正則表達(dá)式中并不提供關(guān)于數(shù)學(xué)的任何功能。
所以只能使用冗長(zhǎng)的分組、選擇和字符集合來(lái)描述一個(gè)正確的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。理解這個(gè)表達(dá)式的關(guān)鍵是理解2[0-4]\d|25[0-5]|[01]?\d\d?,經(jīng)過(guò)上面的介紹,相信讀者能分析得出來(lái)它的意義。
【編輯推薦】