正則表達式

  正則表達式,英文:Regular Expression。它一般用來檢索和替換符合某種模式的文本。正則表達式

  Python自1.5版本開始增長了re模塊,使得Python擁有了所有的正則表達式功能。函數

1、基本函數(match、search、findall)

  在使用re模塊以前,要先引入,re模塊使已經在內置在Python內部的,無需再本身下載安裝了。spa

1 import re

一、re.match函數

1.1 原型:match(pattern, string, flags=0)
1.2 參數:
  pattern:匹配的正則表達式
  string:要匹配的字符串
  flags:標誌位,用來控制正則表達式的匹配方式
    re.I:忽略大小寫
    re.L:作本地化識別
    re.M:多行匹配,影響^和$
    re.S:使.匹配包括換行符在內的全部字符,不然.不匹配換行符
    re.U:根據Unicode字符集解析字符,影響'\w \W \b \B'
    re.X:使咱們以更靈活的格式理解正則表達式
1.3 功能:嘗試從字符串的起始位置匹配一個模式code

1.4 eg:對象

1 # 註釋爲輸出結果
2 
3 print(re.match('www', 'www.baidu.com')) 4 # <_sre.SRE_Match object; span=(0, 3), match='www'>
5 # 返回結果的類型、匹配結果的位置、匹配內容
6 
7 print(re.match('www', 'www.baidu.com').span()) 8 # (0, 3) 輸出匹配的位置

二、re.search函數

2.1 原型:search(pattern, string, flags=0)
2.2 參數:
  pattern:匹配的正則表達式
  string:要匹配的字符串
  flags:標誌位,用來控制正則表達式的匹配方式(與上面內容一致,後面不贅述)
2.3 功能:掃描整個字符串,返回第一個成功的匹配,與match相比,就是沒必要從起始位置開始匹配blog

三、re.findall函數

3.1 原型:findall(pattern, string, flags=0)
3.2 參數:
  pattern:匹配的正則表達式
  string:要匹配的字符串
  flags:標誌位,用來控制正則表達式的匹配方式
3.3 功能:掃描整個字符串,返回結果列表,其中匹配到全部符合模式的結果索引

 2、正則表達式的元字符

一、匹配單個字符

.ci

能夠匹配除換行符之外的任意字符字符串

[]原型

是字符集合,表示匹配方括號中任意所包含的任一字符

[asd]

匹配其中任一字符

[a-z]

匹配任意小寫字母

[0-9a-zA-Z_]

匹配任意大小寫字母或數字或下劃線

[^asd]

匹配除了asd幾個字母之外的全部字符,中括號裏的^號稱爲'脫字符',表示不匹配集合中的字符

[^0-9]

匹配全部非數字字符

\d

匹配數字,效果同[0-9]

[^\d]

匹配非數字字符,效果同[^0-9]

\w

匹配數字,字母和下劃線,效果同[0-9a-zA-Z_]  (字母不包含空格)

\W

匹配非數字,字母和下劃線,效果同[^0-9a-zA-Z_]

\s

匹配任意的空白符(空格,換行,回車,換頁,製表),效果同[ \f\n\r\t]

\S

匹配任意的非空白符,效果同[^ \f\n\r\t]

二、錨字符(邊界字符)

^

行首匹配,和在中括號裏的^不是一個意思

$

行尾匹配

\A

匹配字符串的開始,他和^的區別是,\A只匹配整個字符串的開頭,即便在re.M下也不會匹配他行的行首

\Z

匹配字符串的結束,他和$的區別是,\Z只匹配整個字符串的結束,即便在re.M下也不會匹配他行的行尾

\b

匹配一個單詞的邊界,也就是指單詞和空格間的位置 egr'er\b',匹配以er爲結尾邊界的位置

\B

匹配非單詞邊界,與上面相反,匹配不是邊界的

三、多個字符

(xyz)

匹配小括號內的xyz,做爲一個總體去匹配

x?

匹配0個或者1x

egprint(re.findall(r"a?","aaabaa")) # 非貪婪匹配,儘量少的匹配

x*

匹配0個或者任意多個x

egprint(re.findall(r"a*","aaabaa")) # 貪婪匹配,儘量多的匹配

x+

匹配至少一個x(貪婪匹配)

x{n}

匹配肯定的nxn是一個肯定的非負整數

x{n,}

匹配至少nx

x{n,m}

匹配至少n個,最多mx,注意n<=m

x|y

|表示或,匹配的是xy

四、特殊狀況

*? +? x?

最小匹配,一般都是儘量多的匹配,可使用這種解決貪婪匹配

(?:X)

相似於(xyz),但不表示一個組

3、實用技巧

一、字符串切割

1 str1 = "hello world hello world hello world "
2 # 普通切割
3 print(str1.split(' '))  # 僅僅以一個空格切割,遇到多個空格時會出現不想要的內容
4 # 正則切割
5 print(re.split(r' +', str1))  # 能夠經過正則的切割,其中利用正則的方法,來以任意多個空格來切割

二、re.finditer函數

  • 原型:finditer(pattern, string, flags=0)
  • 參數:
    • pattern:匹配的正則表達式
    • string:要匹配的字符串
    • flags:標誌位,用來控制正則表達式的匹配方式
  • 功能:與findall相似,掃描整個字符串,返回的是一個迭代器,能夠節省空間,提升效率
1 str2 = "hello world hello world hello world hello world hello world"
2 
3 d = re.finditer(r'hello', str2) 4 while True: 5     # 當使用迭代方法時,爲了可使他在找完對象後退出,通常經過捕獲的方法
6     try: 7       print(next(d)) 8     except StopIteration as e: 9       break

三、字符串的替換和修改

  • sub(pattern, repl, string, count=0, flags=0)
  • subn(pattern, repl, string, count=0, flags=0)功能: 在目標字符串中以正則表達式的規則匹配字符串,再把他們替換成指定的字符串。能夠指定替換的次數,若是不指定,替換全部的匹配字符串
    • pattern: 正則表達式(規則)
    • repl: 指定的用來替換的字符串
    • string: 目標字符串
    • count: 最多替換次數
    • flags:
  • 區別: sub返回一個字符串,subn返回一個元組(第一個元素是替換後的字符串,第二個元素是替換的個數)

四、分組

  概念:除了簡單的判斷是否匹配之外,正則表達式還有提取子串的功能。用()表示的就是提取分組。(這個本身試一下,加深印象)

 1 str3 = "010-12312323"
 2 m = re.match(r'(?P<first>\d{3})-(\d{8})', str3)  3 # 使用序號獲取對應組的信息,group(0)一直表明的原始字符串
 4 print(m.group(0))  5 print(m.group(1))  6 print(m.group('first'))  # 使用本身起的名字索引
 7 print(m.group(2))  8 
 9 print(m.groups())  # 查看各組的狀況
10 
11 # 若是在最外層加一個括號,那麼group(1)就是打印的最外面的那個,依次向裏
12 
13 # ?P<first>寫在小括號裏,表示起名字

五、編譯

  • 當咱們使用正則表達式時,re模塊會幹兩件事:

  (1)編譯正則表達式,若是正則表達式自己不合法,會報錯
  (2)用編譯後的正則表達式去匹配對象

  • 編譯的原型:re.compile(pattern, flags=0)

  提示:通常狀況下,比較簡單的匹配咱們直接經過上面講述的那幾種基本方法就能夠了,可是當模式比較複雜,或者這個正則對象在後面還會用到時,就會先把他編譯出來,畢竟後面能夠省去再次編譯的時間,而且更清晰。

  正則對象,習慣上命名爲   re_xxxxxx。

1 pat = r"^1(([3578]\d)|(47))\d{8}$" # 模式
2 re_telephone = re.compile(pat)  # 編譯成正則對象
3 print(re_telephone.match("13612345678"))  # 使用其匹配文本,前面提到的基本方法在這裏照常使用
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息