正規表示式 普通字元組(續)

2022-09-03 13:57:11 字數 2951 閱讀 3212

正規表示式提供了-範圍表示法(range),它更直觀,能進一步簡化字元組。

所謂"-範圍表示法",就是用[x-y]的形式表示x到y整個範圍內的字元,省去一一列出的麻煩,這樣[0123456789]就可以表示為[0-9]。如果你覺得這不算什麼,那麼確實比[abcdefghijklmnopqrstuvwxyz]簡單太多了。

你可能會問,"-範圍表示法"的範圍是如何確定的?為什麼要寫作[0-9],而不寫作[9-0]?

要回答這個問題,必須了解範圍表示法的實質。在字元組中,-表示的範圍,一般是根據字元對應的碼值code point,也就是字元在對應編碼表中的編碼的數值)來確定的,碼值小的字元在前,碼值大的字元在後。在ascii編碼中(包括各種相容ascii的編碼中),字元0的碼值是48(十進位制),字元9的碼值是57(十進位制),所以[0-9]等價於[0123456789];而[9-0]則是錯誤的範圍,因為9的碼值大於0,所以會報錯。

例1-5  [0-9]是合法的,[9-0]會報錯

re.search("^[0-9]$", "2") != none       #

=> true

re.search("^[9-0]$", "2") !=none

traceback (most recent call last):error: bad character range

如果知道0~9的碼值是48~57,a~z的碼值是97~122,a~z的碼值是65~90,能不能用[0-z]統一表示數字字元、小寫字母、大寫字母呢?

答案是:勉強可以,但不推薦這麼做。根據慣例,字元組的範圍表示法都表示一類字元(數字字元是一類,字母字元也是一類),所以雖然[0-9]、[a-z]都是很好理解的,但[0-z]卻很難理解,不熟悉ascii編碼表的人甚至不知道這個字元組還能匹配大寫字母,更何況,在碼值48到122之間,除去數字字元(碼值48~57)、小寫字母(碼值97~122)、大寫字母(碼值65~90),還有不少標點符號(參見表1-1),從字元組[0-z]中卻很難看出來,使用時就容易引起誤會,例1-6所示的程式就很可能讓人莫名其妙。

表1-1  ascii編碼表(片段)

碼值字元

碼值字元

碼值字元

碼值字元

碼值字元480

63?78n

93]108l491

64@79o

94^109m502

65a80p

95_110n513

66b81q

96`111o524

67c82r

97a112p535

68d83s

98b113q546

69e84t

99c114r557

70f85u

100d

115s568

71g86v

101e

116t579

72h87w

102f

117u58:

73i88x

103g

118v59;

74j89y

104h

119w

60< 75k

90z105i

120x61=

76l91[

106j

121y

62> 77m

92\107k

122z

例1-6  [0-z] 的奇怪匹配

re.search("^[0-z]$", "a") != none #

=> true

re.search("^[0-z]$", ":") != none #

=> true

在字元組中可以同時並列多個"-範圍表示法",字元組[0-9a-za-z]可以匹配數字、大寫字母或小寫字母;字元組 [0-9a-fa-f]可以匹配數字,大、小寫形式的a~f,它可以用來驗證十六進製制字元,**見例1-7

例1-7  [0-9a-fa-f]準確判斷十六進製制字元

re.search("^[0-9a-fa-f]$", "0") != none  #

=> true

re.search("^[0-9a-fa-f]$", "c") != none #

=> true

re.search("^[0-9a-fa-f]$", "i") != none #

=> false

re.search("^[0-9a-fa-f]$", "c") != none #

=> true

re.search("^[0-9a-fa-f]$", "g") != none #

=> false

在不少語言中,還可以用轉義序列\xhex來表示乙個字元,其中\x是固定字首,表示轉義序列的開頭,num是字元對應的碼值(code point,詳見第127頁,下文用?127表示),是乙個兩位的十六進製制數值。比如字元a的碼值是41(十進位制則為65),所以也可以用\x41表示。

字元組中有時會出現這種表示法,它可以表現一些難以輸入或者難以顯示的字元,比如\x7f;也可以用來方便地表示某個範圍,比如所有ascii字元對應的字元組就是[\x00-\x7f],**見例1-8。這種表示法很重要,在第120頁還會講到它,依靠這種表示法可以很方便地匹配所有的中文字元。

例1-8  [\x00-\x7f]準確判斷ascii字元

re.search("^[\x00-\x7f]$", "c") != none  #

=> true

re.search("^[\x00-\x7f]$", "i") != none #

=> true

re.search("^[\x00-\x7f]$", "0") != none #

=> true

re.search("^[\x00-\x7f]$", "<") != none #

=> true

正規表示式 排除型字元組

1.5 排除型字元組 在方括號 中列出希望匹配的所有字元,這種字元組叫做 普通字元組 它的確非常方便。不過,也有些問題是普通字元組不能解決的。給定乙個由兩個字元構成的字串str,要判斷這兩個字元是否都是數字字元,可以用 0 9 0 9 來匹配。但是,如果要求判斷的是這樣的字串 第乙個字元不是數字字元...

正規表示式簡介(微軟) 7 普通字元

普通字元 普通字元由所有那些未顯式指定為元字元的列印和非列印字元組成。這包括所有的大寫和小寫字母字元,所有數字,所有標點符號以及一些符號。最簡單的正規表示式是乙個單獨的普通字元,可以匹配所搜尋字串中的該字元本身。例如,單字元模式 a 可以匹配所搜尋字串中任何位置出現的字母 a 這裡有一些單字元正規表...

正規表示式字元

正規表示式符號 字元 描述 標記下乙個字元是特殊字元或文字。例如,n 和字元 n 匹配。n 則和換行字元匹配。序列 和 匹配,而 則和 匹配。匹配輸入的開頭。匹配輸入的末尾。匹配前乙個字元零或多次。例如,zo 與 z 或 zoo 匹配。匹配前乙個字元一次或多次。例如,zo 與 zoo 匹配,但和 z...