程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

自學Python 49 正則表達式(一)基本語法表達

編輯:Python

Python 正則表達式(一)基本語法表達

活動地址:CSDN21天學習挑戰賽

今天繼續學習Python,並且加入活動“CSDN21天學習挑戰賽”,和小伙伴們一起學習啦!


文章目錄

  • Python 正則表達式(一)基本語法表達
  • 一、普通字符
  • 二、非打印字符
  • 三、 特殊字符
    • 3.1 匹配任意單個字符
    • 3.2 從字符串起始或者結尾或者單詞邊界匹配
    • 3.3 創建字符集
    • 3.4 使用閉包操作符實現存在性和頻數匹配
    • 3.5 表示字符集的特殊字符
  • 四、使用小括號指定分組
  • 五、限定符
  • 六、定位符
  • 七、限定范圍和否定
  • 八、 運算符優先級
  • 九、 擴展表示法


正則表達式又被稱為規則表達式,英文名稱是Regular Expression,在程序代碼中經常被簡與為Regex、Regexp、或RE。正則表達式是一種文本模式,包括普通字符(例如, a到z之間的字母)和特殊字符(稱為元字符)。正則表達式描述了一種字符串匹配的模式,可以用來檢查一個字符串是否含有某種子串,將匹配的子串做替換,或著從某個串中取出符合某個條件的子串等。正則表達式是煩瑣的,但它是強大的,學會之後的應用除了提高效率外,還會帶來絕對的成就感。目前絕大多數開發語言都支持利用正則表達式進行字符串操作,例如C+、Java、 C#、PHP、Python等。


一、普通字符

正則表達式是包含文本和特殊字符的字符串,該字符串描述了一個可以識別各種字符串的模式。普通字符包括沒有顯式指定為元字符的所有可打印和不可打印的字符,這包括所有大寫和小寫字母、所有數字、所有標點符號和一些其他符號。例如下面所介紹的正則表達式都是最基本的、最普通的普通字符,它們僅僅用一個簡單的字符串構造成一個匹配子符串的模式:該字符串由正則表達式定義。

正則表達式模式匹配的字符串foofooPythonPythonstudystudy

在上表中, 第一個正則表達式模式是" foo ",該模式沒有使用任何特殊號去匹配其他符號,而只是匹配所描述的內容,所以,能夠匹配這個模式的只有包含“foo”的字符串。同理,對於字符串“Python"和“study"也樣。 正則表達式的強大之處在於引入特殊字符來定義字符集、匹配子組和重復模式。正是由於這些特殊符號,使得正則表達可以匹配字符串集合而不僅僅只是某單個字符串。由此可見,普通字符表達式屬於最簡單的正則表達式形式。

二、非打印字符

非打印字符也可以是正則表達式的組成部分,在下表中列出了表示非打印字符的轉義序列。

字符描述\cx匹配由x指明的控制字符。例如,\cM匹配y一個Control-M或回車符。x的值必須為A-Z或a-z之一。否則,將c視為一個原義的‘C’字符\f匹配一個換頁符。等價於\x0c 和\cL\n匹配一個換行符。等價於\x0a和\cJ\r匹配 一個回車符。 等價於\x0d和\cM\s匹配任何空白字符,包括空格、制表符、換頁符等。等價於[\f\n\r\t\v]\S匹配任何非空白字符。等價於[^\f\n\r\t\v]\t匹配一個制表符。 等價於\x09和\cI\v匹配一個垂直制表符。等價於\x0b和\cK

三、 特殊字符

特殊字符是指一些具有特殊含義的字符, 如" * .xt"中的星號,簡單一點說,就是表示任何字符串的意思。如果要查找文件名中有“ * ”的文件,則需要對“ * ”進行轉義,即在其前加一個“\”,即“ \ * .txt”。許多元字符要求在試圖匹配它們時特別對待,如果要匹配這些特殊字符,必須首先使字符進行轉義,即將“\”放在它們前面。下表列出了正則表達式中的特殊字符。

特別字符描述$匹配輸入字符串的結尾位置,如果設置了RegExp對象的Mutiline 屬性,則 $ 也匹配‘’\n’ 或^\r’。要匹配$字符本身,請使用 \ $()標記一個子表達式的開始和結束位置。子表達式可以獲取供以後使用。要匹配這些字符,請使用 \ ( 和 \ )*匹配前面的子表達式零次或多次。要匹配 * 字符,請使用 \ *+匹配前面的子表達式一次或多次。要匹配 + 字符,請使用 \ +.匹配除換行符 \n之外的任何單字符。 要匹配 . ,請使用 \ .[標記一個中括號表達式的開始。要匹配 [ ,請使用 \ [?匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。 要匹配 ? 字符,請使用 \ ?\將下一個字符標記為或特殊字符或原義字符或向後引用或八進制轉義符。例如’n’ 匹配字符 'n’。‘\ '匹配換行符。序列 “ \ \ ” 匹配“\”,而“ \ ( ‘則匹配“(“^匹配輸入字符串的開始位置,除非在方括號表達式中使用,此時它表示不接受該字符集合。要匹配^ 字符本身,請使用 \ ^{ 標記限定符表達式的開始。要匹配 { ,請使用 \ {

3.1 匹配任意單個字符

點符號“ . ”可以匹配除了換行符“\n”以外的任何字符(Python 正則表達式有一個編譯標記[S或者DOTALL,該標記能夠推翻這個限制,使點號能夠匹配換行符)。無論字母、數字、空格(並不包括“\n”換行符)、可打印字符、不可打印字符,還是一個符號,使用點號都能夠匹配它們。例如下表中的演示信息:

正則表達式模式匹配的字符串f.o匹配在字母“f”和“o”之間的任意一個字符;例如 fao、f9o、f#o等…任意兩個字符.end匹配在字符串 end之前的任意一個字符

3.2 從字符串起始或者結尾或者單詞邊界匹配

還有一些符號和相關的特殊字符用於在字符串的起始和結尾部分指定用於搜索的模式。如果要匹配字符串的開始位置,就必須使用脫字符“^”或者特殊字符“\A”(反斜線和大寫字母A)。後者主要應用於那些沒有脫字符的鍵盤(例如,某些國際鍵盤)。同樣,美元符號“$”或“\Z”將用於匹配字符串的末尾位置。

正則表達式模式匹配的字符串^From任何以 From 作為起始的字符串/bin/tcsh$任何以/bin/tcsh作為結尾的字符串^Subject: hi$任何由單獨的字符串 Subiect: hi構成的字符串the任何包含the的字符串\bthe任何以 the開始的字符串\bthe\b僅僅匹配單詞the\Bthe任何包含但並不以 the 作為起始的字符串

3.3 創建字符集

盡管句點可以用於匹配任意符號,但是在某些時候,可能想要匹配某些特定字符。正因如此,發明了中括號。該正則表達式能夠匹配一對中括號中包含的任何字符。例如下表中的演示實例。

正則表達式模式匹配的字符串b[aeiu]tbat、bet、bit、but[cr][23][dp][o2]一個包含四個字符的字符串,第一個字符是“c”或“r”,然後是“2”或“3”,後面是“d”或“p”,最後要麼是“o”,要麼是“2”。例如,c2do、r3p2、r2d2、c3po等

3.4 使用閉包操作符實現存在性和頻數匹配

下面開始介紹最常用的正則表達式符號,即特殊符號*、+和?,所有這些都可以用於匹配-一個、多個或者沒有出現的字符串模式。具體說明如下所示。
(1)星號或者星號操作符(*)將匹配其左邊的正則表達式出現零次或者多次的情況(在計算機編程語言和編譯原理中,該操作稱為Kleene閉包)。
(2)加號(+)操作符將匹配一次或者多次出現的正則表達式(也叫作正閉包操作符)。
(3) 問號(? )操作符將匹配零次或者一次出現的正則表達式。
(4)大括號操作符({}) ,裡面或者是單個值或者是一對由逗號分隔的值。這將最終精確地匹配前面的正則表達式N次(如果是{N})或者一定范圍的次數:例如,{M, N}將匹配M ~ N次出現。這些符號能夠由反斜線符號轉義: \ * 匹配星號,等等。
使用閉包操作符實現存在性和頻數匹配演示的具體說明如下表所示:

正則表達式模式匹配的字符串[dn]ot?字母“d”或者“n”,後面跟著一個“o”,然後最多是一個“t”,例如,do、 no、dot、not0?[1-9]任何數值數字,它可能前置一個“0”,例如,匹配一系列數(表示從1~ 9月的數值),不管是一個還是兩個數字[0-9]{15,16}匹配15或者16個數字(例如信用卡號碼)</?[^>]+>匹配全部有效的(和無效的) HTML標簽[KORBNP]a-h][1-8]-[a-h][1-8]在“長代數”標記法中,表示國際象棋合法的棋盤移動(儀移動,不包括吃子和將軍)。即“K”、“Q”、“R”、“B”、“N”或“P”等字母後面加上“al”~“h8”之間的棋盤坐標。前面的坐標表示從哪裡開始走棋,後面的坐標代表走到哪個位置(棋格)上

3.5 表示字符集的特殊字符

有一些特殊字符能夠表示字符集,與使用“0-9”這個范圍表示十進制數相比,可以簡單地使用\d表示匹配任何十進制數字。另一個特殊字符 (w)能夠用於表示全部字母數字的字符集,相當於[A-Za-z0-9_]的縮寫形式,\s可以用來表示空格字符。這些特殊字符的大寫版本
表示不匹配;例如,\D表示任何非十進制(與[^0-9]相同),等等。使用這些縮寫,可以表示如下表所示的一些更復雜的實例:

正則表達式模式匹配的字符串\w+ -\d+一個由字母數字組成的字符和一串由一個連字符分隔的數字[A-Za-z]w*第一個字符是字母:其余字符(如果存在)可以是字母或者數字(幾乎等價於Python中的有效標識符)\d{3}-\d{3}-\d{4}美國電話號碼的格式,前面是區號前綴,例如80-551-1212\[email protected]\w+.com以[email protected]格式表示簡單的電子郵件地址

四、使用小括號指定分組

在python程序中,有時可能會對之前匹配成功的數據更感興趣。我們不僅想要知道整個符串是否否匹配我們的標准,而且想要知道能否提取任何已經成功匹配的特定字符串或者子字符串。答案是可以,要實現這個目標,只要用一對小括號括住任何正則表達式,當使用正則表達式時,一對小括號可以實現以下任意一個 (或者兩個)功能:
(1)對正則表達式進行分組。
(2)匹配子組。
例如下表展示了使用小括號實現指定分組的使用說明:

正則表達式模式匹配的字符串\d+(.\d*)?表示簡單浮點數的字符串:也就是說,任何十進制數字, 後面可以接一 個小數點和零個或者多個十進制數字,例如“0.004、“2”、“713."等(Mr?s?.)?[A-Z][a-z]*[A-Za-Z-]+名字和姓氏,以及對名字的限制(如果有,首字母必須大寫,後續字母小寫),全名前可以有可選的“Mr.“、“Mrs.”、 “Ms.” 或者"M."” 作為稱謂,以及靈活可選的姓氏,可以有多個單詞、橫線以及大寫字母

五、限定符

限定符用來指定正則表達式的一個給定組件必須要出現多少次才能滿足匹配,有*或+或?或{n}或{n,}或{n,m}共6種。正則表達式中的限定符信息如下表所示:

字符描述*匹配前面的子表達式零次或多次,例如,zo*能匹配”z” 以及“zoo”。*等價於{0,}+匹配前面的子表達式一次或多次。例如,“zo+” 能匹配“zo” 以及“zoo”, 但不能匹配“z”。+等價於{1,}?匹配前面的子表達式零次或一次。例如,“do(es)?"可以匹配“do"或“does"中的“do”。?等價於{0,1}{n}n是一個非負整數。匹配確定的n次。例如, ‘o{2}’ 不能匹配“Bob” 中的‘o’,但是能匹配“food"中的兩個o{n,}n是一個非負整數。至少匹配n次。例如, ‘o{2,},不能匹配“Bob” 中的‘o’,但能匹配“fooood”中的所有o. “o{1,}” 等價於“o+’。'o{0,}‘則等價於‘o*’{n,m}m和n均為非負整數,其中n<= m。最少匹配n次且最多匹配m次。例如,“o{1,3}” 將匹配“fooood” 中的前3個o。 ‘o{0.1}’ 等價於’o?’。請注意在逗號和兩個數之有空格

六、定位符

通過使用定位符,可以將正則表達式固定到行首或行尾。另外還可以幫助我們創建這樣的正則表達式,這些正則表達式出現在一個單詞內、在一個單詞的開頭或者一個單詞的結尾。定位符用來描述字符串或單詞的邊界,^ 和 $ 分別指字符串的開始與結束,\b描述單詞的前成後邊界,\B表示非單詞邊界。常用的正則表達式的定位符如下表所示:

字符描述^匹配輸入字符串開始的位置。如果設置了RegExp對象的Mutine屬性,^還會與\n或\r之後的位置匹配$匹配輸入字符串結尾的位置。如果設置了RegExp 對象的Mutine屬性,$還會與\n或\r之前的位置匹配\b匹配-一個字邊界,即字與空格間的位置\B非字邊界匹配

七、限定范圍和否定

除了單字符以外,字符集還支持匹配指定的字符范圍。方括號中兩個符號中間用連字符“-” 連接,用於指定一個字符的范圍,例如,A-Z、a-z或者0-9分別用於表示大寫字母、小寫字母和數值數字。這是一個按照字母順序的范圍,所以不能將它們僅僅限定用於字母和十進制數字上。另外,如果脫字符“^”緊跟在左方括號後面,這個符號就表示不匹配給定字符集中的任何一個字符。具體演示實例如下表所示:

正則表達式模式匹配的字符串z.[0-9]字母"z”後面跟著任何一個字符,然後跟著一個數字[r-u][env-y][us]字母“r”、"s”、“t”或者“u” 後面跟著“e”、“n”、“v”、“w”、“x”或者“y”,然後跟著“u”或者“s”[^aeiou]一個非元音字符[^\t\n]不匹配制表符或者\n[“-a]在一個ASCII系統中,所有字符都位於““”和“a”之間,即34-97之間

八、 運算符優先級

正則表達式從左到右進行計算,並遵循優先級順序,這與算術表達式非常類似。相同優先級的從左到右進行運算,不同優先級的運算先高後低。下表從最高到最低說明了各種正則表達式運算符的優先級順序。

運算符描述\轉義符(),(? : ),(?=),[]小括號和方括號*,+,?, {n}, {n,}, {n,m}限定符^,$,\ 任何元字符、任何字符定位點和序列 (即: 位置和順序)

九、 擴展表示法

擴展表示法以問號開始(?…) ,通常用於在判斷匹配之前提供標記,實現一個前視(或者後視)匹配或者條件檢查。盡管小括號使用這些符號,但是只有(? P < name>) 表述一個分組匹配,所有其他的都沒有創建一個分組。 然而,你仍然需要知道它們是什麼?因為它們可能最適合用於你所需要完成的任務。下表展示了擴展表示法的基本用法:

正則表達式模式匹配的字符串(?:\w+.)*以句點作為結尾的字符串,例如"gogel.“、 “itte.”、 “fcbook,”, 但是這些匹配不會保存下來供後續的使用和數據檢索(?#comment)此處並不做匹配, 只是作為注釋(?=.com)如果一個字符串後面跟著“.com”才做匹配操作,並不使用任何目標字符串(?!.net)如果一個字符串後面不是跟著“.net" 才做匹配操作(?<=800-)如果宇符串之前為"800-"才做匹配。假定為電話號碼,同樣,並不使用任何輸入字符串(?<!192 \ .168\ .)如果個字符串之前不是"192.168"才做匹配操作,假定用於過濾掉一組C類IP地址(?(1)y l x)如果一個匹配組1(\C)存在,就與y匹配;否則,就與x匹配
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved