正則的學習(一)

正則表達式 正則表達式定義 正則表達式(regular expression)是一個特殊的字符序列,描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子串。將匹配的子串替換或者從某個串中取出符合某個條件的子串,或者是在指定的文章中抓取特定的字符串等 正則表達式大致的匹配過程是: 拿正則表達式依次和字符串或者文本中的字符串做比較,如果每一個字符都匹配,則匹配成功,只要有一個匹配不成功的字符,則匹配不成功。 正則表達式的原始字符表示r 由於正則表達式通常會包含反斜槓等特殊字符,所以最好用原始字符串來表示,例如: r”\d” 等價於\\d 表示匹配一個數字 正則表達式的原始字符表示r 由於正則表達式通常會包含反斜槓等特殊字符,所以最好用原始字符串來表示,例如: r”\d” 等價於\\d 表示匹配一個數字 正則表達式的貪婪性 正則表達式中數量詞(* 、+、?、{m,n})默認是貪婪的,會盡量多的去匹配滿足條件的字符; 字符轉abbbc,如果用ab* ,會匹配abbb >>> re.match(r"ab*","abbbc").group() 'abbb' 抑制正則表達式的貪婪性 雖然正則表達式中數量詞默認是貪婪的,但是可以在數量詞的後面加上?來抑制貪婪性,表示匹配儘可能少的滿足條件的字符 >>> re.match(r"ab*?","abbbc").group() 'a' >>> re.search(r"\d+?$","a123456").group()#$前的?不能屏蔽貪婪模式 '123456' 在使用?抑制貪婪性時候,?後面不能有字符存在,否則抑制失效 一個抑制貪婪的例子 >>> patt = r".+(\d+-\d+-\d+)" >>> m = re.match(patt,data) >>> m.group() 'Sat Apr 28 06:55:01 1973::[email protected]::104799301-4-12' >>> m.group(1) '1-4-12' 我們想要用分組提取104799301-4-12,而不是1-4-12',第一個整數的其餘部分在哪裏? 問題在於正則表達式本質上是貪婪匹配。這意味着對於該統配符模式,將對正則表達式從左至右按順序求值,而且試圖匹配該模式的儘可能多的字符;使用.+將獲取從字符串起始位置開始的全部單個字符,包括我們所期望提取的第一個整數部分,而\d+僅僅需要一個數字,因此匹配到4,.+匹配了從字符串起始部分到所期望的第一個數字的全部內容10479930 我們可以使用非貪婪操作符?抑制貪婪匹配,在.+後加?後,獲得了我們所期望的'104799301-4-12' >>> patt = r".+?(\d+-\d+-\d+)" >>> m = re.match(patt,data) >>> m.group() 'Sat Apr 28 06:55:01 1973::[email protected]::104799301-4-12' >>> m.group(1) '104799301-4-12' 其實我們也可以使用::作爲字符分割符 >>> patt = r".+::(\d+-\d+-\d+)" >>> re.match(patt,data).group(1) '104799301-4-12' 正則表達式元素 .(點) 匹配除換行符外的任意一個字符,但是在re.DOTALL模式中可以匹配換行符\n \ 轉義一個特殊的字符,使這個字符表示字面上本來的意思,比如:\.表示匹配一個點,\$匹配$符號 \d 匹配任意一個數字,等價於[0-9] \D 匹配任意一個非數字,等價於[^0-9] \s 匹配任意一個空白字符,包括 空格、\t \r \n \v \f \S 匹配任意一個非空白字符,等價於[^\s] \w 匹配一個字母或數字或下劃線_,等價於[A-Za-z0-9_] \W 匹配一個非字母或非數字或非下劃線,等價於[^A-Za-z0-9_] [...] 匹配其中的任意一個字符 [^...] 不匹配方括號中出現的單個字符 正則表達式數量詞 * 匹配前一個字符0次或多次 + 匹配前一個字符1次或多次 ?匹配前一個字符0次或1次 {n} 匹配前一個字符n次 {m,n} 匹配前一個字符m 到n次 {m,} 匹配前一個字符至少m次 {,n} 匹配前一個字符最多n次 正則表達式特殊表達式 ^ 匹配字符串的開頭,如果用在方括號中,表示否定,如:[^0-9]非數字字符 & 匹配字符串的結尾 \b 匹配單詞的邊界,也就是單詞和空格間的位置,例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。其實也可以匹配逗號、句號等其他字符和單詞之間的位置,但是不能匹配數字和單詞之間的位置 | 或匹配符,表達左右正則表達式任意匹配一個。如果左邊的表達式匹配上了,匹配結束,不再匹配右邊的表達式。該符號一般放在()中使用,如果沒在圓括號中則它的範圍是整個正則表達式。 \<number> 引用分組匹配到的分組編號爲<number>的字符串 (?P<name>...) 命名分組,給分組指定一個別名,P是大寫 (?P=name) 引用分組名爲name的分組匹配,這個是在正則表達式中引用,表示匹配重複的字符串,也可以使用編號引用 (?<=Pattern) 前向肯定斷言語法,匹配的字符串前面存在Pattern匹配的內容纔可以匹配成功,是輸出匹配的字符串,Pattern匹配的內容不輸出 如: re.search(r"(?<=\d{3})[A-Z]+","12A345B"),大寫字母前面有3個數字纔可以匹配大寫字母,此處匹配B,且輸出B 注意前向肯定、前向否定量詞只能使用{n} 不能使用+ 、*等 (?<!Pattern) 前向否定斷言語法,匹配的字符串前面不存在Pattern匹配的內容纔可以匹配成功,是輸出匹配的字符串,Pattern匹配的內容不輸出 如: re.search(r"(?<!\d{3})[A-Z]+","12A345B"),大寫字母前面不是3個數字纔可以匹配大寫字母,此處匹配A,且輸出A (?=Pattern) 後向肯定斷言語法,匹配的字符串後面存在Pattern匹配的內容纔可以匹配成功,是輸出匹配的字符串,Pattern匹配的內容不輸出 如:後面有多個小寫字母的數字纔會匹配 >>> re.search(r"\d+(?=[a-z]+)","1 23ab4").group() '23' (?!Pattern) 後向否定斷言語法,匹配的字符串後面不存在Pattern匹配的內容纔可以匹配成功,是輸出匹配的字符串,Pattern匹配的內容不輸出 如:後面不是多個小寫字母的數字纔會匹配 >>> re.search(r"\d+(?![a-z]+)","1 23ab4").group() '1' (?#...) 後面的內容被當做註釋忽略 (?iLmsux) (集合'i', 'L', 'm', 's', 'u', 'x'中的一個或多個字母。)這個分組空字符串;這些字母整個正則表達式設置相應的標記:re.I(忽略大小寫),re.L(依賴區域設置),re.M(多行),re.S(點號匹配所有字符),re.U(依賴Unicode),re.X(詳細模式)。(這些標誌在模塊的內容中講述)。它用於如果你想要包含這些標誌作爲正則表達式的一部分,而不是將flag參數傳遞給re.compile()函數。 請注意,(?x)標誌更改解析表達的方式。它應使用在表達式字符串的開始,或一個或多個空白字符之後。如果在這個標誌之前有非空白字符,結果是未定義的。 (?:...) 括號形式的正則表達式的非匹配版本。匹配括號中的任何正則表達式,但是匹配的子字符串不能在匹配後提取或在模式中引用。 (?iLmsux) >>> re.match(r"(?i)[a-z]+","ABC") <_sre.SRE_Match object; span=(0, 3), match='ABC'> >>> re.match(r"(?i)[a-z]+","ABC").group() 'ABC' 等價於 >>> re.match(r"[a-z]+","ABC",re.I).group() 'ABC' 正則表達式編譯模式的使用步驟: 1、編譯正則表達式,輸出正則表達式對象 2、使用正則表達式對象處理文本並輸出正則匹配對象 >>> pattern = re.compile(r"\d+")#編譯正則表達式 >>> type(pattern) <class '_sre.SRE_Pattern'>#正則表達式對象 >>> pattern.search("a123b") <_sre.SRE_Match object; span=(1, 4), match='123'>#正則匹配對象 >>> pattern.search("a123b").group()#正則匹配對象調用group()輸出匹配內容 '123' re.compile 函數 compile 函數用於編譯正則表達式,生成一個正則表達式( Pattern )對象,供 match() 和 search() 這兩個函數使用。 語法: re.compile(pattern[, flags]) pattern 字符串形式的正則表達式 flags 可選,表示匹配模式 re.I 忽略大寫寫 re.L 表示特殊字符集,\w, \W, \b, \B, \s, \S 依賴當前環境 re.M 多行模式 re.S 表示.(點)包括換行符\n在內的任意字符 re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴於 Unicode 字符屬性數據庫 re.X 爲了增加可讀性,忽略空格和#後面的註釋 pattern正則表達式對象的屬性、方法 Pattern正則表達式對象是一個編譯好的正則表達式對象,通過re.compile()編譯後的結果 >>> dir(pattern) ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__ ', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '_ _lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'findall', 'finditer', 'flags', 'fullmatch', 'groupindex', 'groups', 'match', 'pattern', 'scanner', 'search', 'split', 'sub', 'subn'] flags 屬性 表示編譯時候的匹配模式, re.compile(pattern[, flags]) flags 可選,表示匹配模式 re.I 忽略大寫寫 re.L 表示特殊字符集,\w, \W, \b, \B, \s, \S 依賴當前環境 re.M 多行模式 re.S 表示.(點)包括換行符\n在內的任意字符 re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴於 Unicode 字符屬性數據庫 re.X 爲了增加可讀性,忽略空格和#後面的註釋 >>> p = re.compile(r"(\w+)(\w+)(?P<sign>.*)",re.S) >>> print(p.flags) 48
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章