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

21天學Python --- 打卡2:Regular Expression

編輯:Python

21天學Python --- 打卡2:Regular Expression

    • 1.Common characters
    • 2.Priority
    • 3.Demo
      • 3.1 普通字符
      • 3.2 中括號
      • 3.3 首字母匹配
      • 3.4 結尾匹配
      • 3.5 反斜槓
      • 3.6 {n}
      • 3.7 *
      • 3.8 +
      • 3.9 .
      • 3.10 ?
      • 3.11 {m,n}
    • 4.Share
      • 4.1 compile
      • 4.2 other methods
    • 5.Re model


                                        測試工具: https://c.runoob.com/front-end/854/.


1.Common characters

模式描述^匹配字符串的開頭$匹配字符串的末尾。.匹配除 “\n” 之外的任何單個字符。要匹配包括 ‘\n’ 在內的任何字符,請使用象 ‘[.\n]’ 的模式。[...]用來表示一組字符,單獨列出:[amk] 匹配 ‘a’,‘m’或’k’[^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。re*匹配0個或多個的表達式。re+匹配1個或多個的表達式。re?匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式re{n}匹配n個前面表達式。例如,"o{2}“不能匹配"Bob"中的"o”,但是能匹配"food"中的兩個o。re{ n,}精確匹配n個前面表達式。例如,"o{2,}“不能匹配"Bob"中的"o”,但能匹配"foooood"中的所有o。"o{1,}“等價於"o+”。"o{0,}“則等價於"o*”。re{ n, m}匹配 n 到 m 次由前面的正則表達式定義的片段,貪婪方式`ab`(re)匹配括號內的表達式,也表示一個組(?imx)正則表達式包含三種可選標志:i, m, 或 x 。只影響括號中的區域。(?-imx)正則表達式關閉 i, m, 或 x 可選標志。只影響括號中的區域。(?: re)類似 (…), 但是不表示一個組(?imx: re)在括號中使用i, m, 或 x 可選標志(?-imx: re)在括號中不使用i, m, 或 x 可選標志(?#...)注釋.(?= re)前向肯定界定符。如果所含正則表達式,以 … 表示,在當前位置成功匹配時成功,否則失敗。但一旦所含表達式已經嘗試,匹配引擎根本沒有提高;模式的剩余部分還要嘗試界定符的右邊。(?! re)前向否定界定符。與肯定界定符相反;當所含表達式不能在字符串當前位置匹配時成功。(?> re)匹配的獨立模式,省去回溯。\w匹配包括下劃線的任何單詞字符。等價於’[A-Za-z0-9_]'。\W匹配任何非單詞字符。等價於 ‘[^A-Za-z0-9_]’。\s匹配任何空白字符,包括空格、制表符、換頁符等等。等價於 [ \f\n\r\t\v]。\S匹配任何非空白字符。等價於 [^ \f\n\r\t\v]。\d匹配任意數字,等價於 [0-9]。\D匹配一個非數字字符。等價於 [^0-9]。\A匹配字符串開始\Z匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串。\z匹配字符串結束\G匹配最後匹配完成的位置。\b匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。\B匹配非單詞邊界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。\n, \t, 等。匹配一個換行符。匹配一個制表符, 等\1...\9匹配第n個分組的內容。\10匹配第n個分組的內容,如果它經匹配。否則指的是八進制字符碼的表達式。

2.Priority

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

3.Demo

3.1 普通字符

import re
a = "abc123+-*"
b = re.findall('abc',a)
print(b)

3.2 中括號

s = "a123456b"
rule = "a[0-9][1-6][1-6][1-6][1-6][1-6]b" #這裡暫時先用這種麻煩點的方法,後面有更容易的,不用敲這麼多[1-6]
l = re.findall(rule,s)
print(l)
['a123456b']
s = "abcabcaccaac"
rule = "a[a,b,c]c" # rule = "a[a-z0-9][a-z0-9][a-z0-9][a-z0-9]c"
l = re.findall(rule, s)
print(l)
['abc', 'abc', 'acc', 'aac']
print(re.findall("caa[a,^]", "caa^bcabcaabc"))
['caa^']
print(re.findall("caa[^,a]", "caa^bcabcaabc"))
['caa^', 'caab']

3.3 首字母匹配

print(re.findall("^abca", "abcabcabc"))
['abca']

3.4 結尾匹配

print(re.findall("abc$", "accabcabc"))
['abc']

3.5 反斜槓

  • \d:匹配任何十進制數等價於[0-9]
print(re.findall("c\d\d\da", "abc123abc"))
['c123a']
  • \可以轉義成普通字符
print(re.findall("\^abc", "^abc^abc"))
['^abc', '^abc']
  • \s:匹配任何的空白字符
print(re.findall("\s\s", "a c"))
[' ', ' ']
  • \w匹配任何字母數字和下劃線,等價於[a-zA-Z0-9_]
print(re.findall("\w\w\w", "abc12_"))
['abc', '12_']

3.6 {n}

  • {n}可以避免重復寫,比如前面我們用\w時寫了3次\w,而這裡我們這需要用用上{n}就可以,n表示匹配的次數
print(re.findall("\w{2}", "abc12_"))
['ab', 'c1', '2_']

3.7 *

  • *表示匹配零次或多次(盡可能的多去匹配)
print(re.findall("010-\d*", "010-123456789"))
['010-123456789']

3.8 +

  • +表示匹配一次或多次
print(re.findall("010-\d+", "010-123456789"))
['010-123456789']

3.9 .

  • .用來操作除了換行符以外的任何字符
print(re.findall(".", "010\n?!"))
['0', '1', '0', '?', '!']

3.10 ?

  • ?表示匹配一次或零次
print(re.findall("010-\d?", "010-123456789"))
['010-1']
  • 貪婪模式:盡可能多的去匹配數據,表現為\d後面加某個元字符,例如\d*
print(re.findall("010-\d*", "010-123456789"))
['010-123456789']
  • 非貪婪模式:盡可能少的去匹配數據,表現為\d後面加?,例如\d?
print(re.findall("010-\d*?", "010-123456789"))
['010-']

3.11 {m,n}

  • m,n指的是十進制數,表示最少重復m次,最多重復n次
print(re.findall("010-\d{3,5}", "010-123456789"))
['010-12345']
  • 加上?表示盡可能少的去匹配
print(re.findall("010-\d{3,5}?", "010-123456789"))
['010-123']

靈活用法:

  • {1,} 相當於前面提過的 + 的效果
  • {0,1} 相當於前面提過的 ? 的效果
  • {0,} 相當於前面提過的 * 的效果

4.Share

4.1 compile

s = "010-123456789"
rule = "010-\d*"
rule_compile = re.compile(rule) #返回一個對象
# print(rule_compile)
s_compile = rule_compile.findall(s)
print(s_compile) #打印compile()返回的對象是什麼
['010-123456789']

4.2 other methods

  • findall()
    找到re匹配的所有字符串,返回一個列表
  • search()
    掃描字符串,找到這個re匹配的位置(僅僅是第一個查到的)
  • match()
    決定re是否在字符串剛開始的位置(匹配行首)
s = "010-123456789"
rule = "010-\d*"
rule_compile = re.compile(rule) # 返回一個對象
# print(rule_compile)
s_compile = rule_compile.match(s)
print(s_compile) # 打印compile()返回的對象是什麼
<re.Match object; span=(0, 13), match='010-123456789'>

5.Re model

  • findall()
前面很多demo
  • sub(正則,新字符串,原字符串)
s = "abcabcacc" #原字符串
l = re.sub("abc","ddd",s) #通過sub()處理過的字符串
print(l)
ddddddacc
  • subn(正則,新字符串,原字符串)
s = "abcabcacc" #原字符串
l = re.subn("abc","ddd",s) #通過sub()處理過的字符串
print(l)
('ddddddacc', 2)
  • split()
s = "abcabcacc"
l = re.split("b",s)
print(l)
['a', 'ca', 'cacc']

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved