複習總結正規表示式 上

2022-02-08 06:28:19 字數 4369 閱讀 7029

(資料上傳到github上

1.什麼叫正規表示式。

正規表示式,又稱規則表示式。(英語:regular expression,在**中常簡寫為regex、regexp或re)。

正則表通常被用來查詢、替換那些符合某個模式(規則)的文字,正規表示式就是用來做這件事的工具。

就像windows/dos下用於檔案查詢的萬用字元(wildcard),也就是*和?。如果你想查詢某個目錄下的所有的word文件的話,你會搜尋*.doc。在這裡,*會被解釋成任意的字串。和萬用字元類似,正規表示式也是用來進行文字匹配的工具,只不過比起萬用字元,它能更精確地描述你的需求——當然,代價就是更複雜——比如你可以編寫乙個正規表示式,用來查詢所有以0開頭,後面跟著2-3個數字,然後是乙個連字型大小「-」,最後是7或8位數字的字串(像010-12345678或0376-7654321)。

(talk is cheap ,show you the code )

2.常用的正規表示式元字元

先介紹乙個概念:元字元metacharacter

所謂元字元就是指那些在正規表示式中具有特殊意義的專用字元,就是下面的紅色的字元。

(1)\b   :代表著單詞的開頭或結尾,也就是單詞的分界處,只替換乙個位置

比如要精確找到謀篇文章裡面的hello這個單詞那麼,正規表示式就應該是這個樣子: 

\bhello\b

(2).   :. 代表匹配除了換行符以外的任意字元

(3)*  :它代表的不是字元,也不是位置,而是數量——它指定*

前邊的內容可以連續重複使用任意次以使整個表示式得到匹配。

例子: 要找hello後面不遠的liming這個單詞:

正規表示式為:\bhello\b.*\blucy\b 

意思就很明顯了:先是乙個單詞hello然後是任意個任意字元(但不能是換行),最後是liming這個單詞

(4)\d :匹配

一位數字(0,或1,或2,或……)

例子:中國**號碼 形式用正規表示式表達出來:

正規表示式:0\d\d-\d\d\d\d\d\d\d\d      (注:-不是元字元,只匹配它本身——連字元(或者減號,或者中橫線,或者隨你怎麼稱呼它) 

或者:0\d-\d                                (注:這裡\d後面的()的意思是前面\d必須連續重複匹配2次(8次)

)(5)\s  :匹配任意的空白符,包括空格,製表符(tab),換行符,中文全形空格等

(6)\w  :匹配字母或數字或下劃線或漢字等

例子:\ba\w*\b匹配以字母a開頭的單詞——先是某個單詞開始處(\b),然後是字母a,然後是任意數量的字母或數字(\w*),最後是單詞結束處(\b)。

(7)+   :+是和*類似的元字元,不同的是*匹配重複任意次(可能是0次),而+則匹配重複1次或更多次。

例子:\d+匹配1個或更多連續的數字

\b\w\b 匹配剛好6個字元的單詞

(8)^   :

匹配字串的開始

(9)$    :

匹配字串的結束

元字元^(和數字6在同乙個鍵位上的符號)和$都匹配乙個位置,這和\b有點類似。^匹配你要用來查詢的字串的開頭,$匹配結尾。

例子:qq號規定5-12位的數字:^\d$

這裡的和前面介紹過的是類似的,只不過匹配只能不多不少重複2次,則是重複的次數不能少於5次,不能多於12次,否則都不匹配。

因為使用了^和$,所以輸入的整個字串都要用來和\d來匹配,也就是說整個輸入必須是5到12個數字,因此如果輸入的qq號能匹配這個正規表示式的話,

那就符合要求了。

和忽略大小寫的選項類似,有些正規表示式處理工具還有乙個處理多行的選項。如果選中了這個選項,^和$的意義就變成了匹配行的開始處和結束處。

3.字元轉義

如果你想查詢元字元本身的話,比如你查詢

.,或者

*,就出現了問題:你沒辦法指定它們,因為它們會被解釋成別的意思。

這時你就得使用\來取消這些字元的特殊意義。

因此,你應該使用

\.和\*。當然,要查詢\本身,你也得用\\

例如mahuaqun.net   用正規表示式為:mahuaqun\.net

4. 關於代表重複的限定符

(1)*重複零次或更多次

(2)+

重複一次或更多次

(3)?

重複零次或一次

(4)

重複n次

(5)

重複n次或更多次

(6)重複n到m次

例子:windows\d+匹配windows後面跟1個或更多數字

^\w+匹配一行的第乙個單詞(或整個字串的第乙個單詞,具體匹配哪個意思得看選項設定)

5.匹配乙個字元或乙個範圍

[ ]    :

(1)匹配括號裡面的任何乙個字元

例子:  [aeiou] :就匹配任何乙個英文母音字母

[.?!]匹配標點符號(.或?或!)

(2)指定乙個範圍

例子:[0-9]代表的含意與\d就是完全一致的:一位數字

[a-z0-9a-z_]也完全等同於\w(如果只考慮英文的話)

下面是乙個更複雜的表示式:\(?0\d[) -]?\d。

「(」和「)」也是元字元,後面會提到,所以在這裡需要使用轉義。

這個表示式可以匹配幾種格式的**號碼,像(010)88886666,或022-22334455,或02912345678等。我們對它進行一些分析吧:首先是乙個轉義字元\(,它能出現0次或1次(?),然後是乙個0,後面跟著2個數字(\d),然後是)或-或空格中的乙個,它出現1次或不出現(?),最後是8個數字(\d)。

6.正規表示式中的「或」

|: |可以把不同的規則分隔開

例子:

0\d-\d|0\d-\d這個表示式能匹配兩種以連字型大小分隔的**號碼:一種是三位區號,8位本地號(如010-12345678),一種是4位區號,7位本地號(0376-2233445)。

\(0\d\)[- ]?\d|0\d[- ]?\d這個表示式匹配3位區號的**號碼,其中區號可以用小括號括起來,也可以不用,區號與本地號間可以用連字型大小或空格間隔,也可以沒有間隔。你可以試試用分枝條件把這個表示式擴充套件成也支援4位區號的。

7.分組(給字串)

我們已經提到了怎麼重複單個字元(直接在字元後面加上限定符就行了);

但如果想要重複多個字元又該怎麼辦?

你可以用小括號來指定子表示式(也叫做分組),然後你就可以指定這個子表示式的重複次數了,你也可以對子表示式進行其它一些操作(後面會有介紹)。

():分組

例子:(\d\.)\d是乙個簡單的ip位址匹配表示式。要理解這個表示式,請按下列順序分析它:\d匹配1到3位的數字,(\d\.)匹配三位數字加上乙個英文句號(這個整體也就是這個分組)重複3次,最後再加上乙個一到三位的數字(\d)。

注意:ip位址中每個數字都不能大於255

(2[0-4]\d|25[0-5]|[01]?\d\d?)\.)(2[0-4]\d|25[0-5]|[01]?\d\d?)。

理解這個表示式的關鍵是理解2[0-4]\d|25[0-5]|[01]?\d\d?,這裡我就不細說了,你自己應該能分析得出來它的意義。

8.反義

有時需要查詢不屬於某個能簡單定義的字元類的字元。比如想查詢除了數字以外,其它任意字元都行的情況,這時需要用到反義:

\w  :匹配任意不是字母,數字,下劃線,漢字的字元

\s   :匹配任意不是空白符的字元

\d   :匹配任意非數字的字元

\b   :匹配不是單詞開頭或結束的位置

[^x] :匹配除了x以外的任意字元

[^aeiou]:匹配除了aeiou這幾個字母以外的任意字元

例子:\s+匹配不包含空白符的字串。

]+>匹配用尖括號括起來的以a開頭的字串。

正規表示式複習

字元描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了regexp 物件的multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束位置...

正規表示式複習

字元描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了regexp物件的multiline屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束位置。如果...

正規表示式複習

為了下列場景中的需求,可以使用正規表示式非常簡單的完成,這就是使用正規表示式的目的 在乙個檔案中,查詢出itcast開頭的語句 在乙個檔案中,找到含有itcast的語句 在乙個檔案中,找到郵箱為163或者126的所有郵件位址 通常正規表示式對字串匹配的時候,可以使用re模組 import re 使用...