1. 程式人生 > >python筆記-正則表達式

python筆記-正則表達式

ebp 可用 方式 換行 裏的 body tps arch 正則表達式

  • 什麽是正則表達式:

正則表達式是一個特殊的字符序列,能幫助我們方便的檢查一個字符串是否與某種模式匹配(定義往往都很枯燥)

也稱之為”模式“,即可用於檢查一個給定的字符串是否符合某種模式

舉例:

我們定義一個模式,平常經常用到的日期模式:XXXX-XX-XX,2018-03-10

在正則表達式的模式定義語法裏:\d用來指定一個數字,因此我們將日期的正則表達式的模式定義成:”\d\d\d\d-\d\d-\d\d"

  • 什麽是元字符:

元字符是一些在正則表達式中有特殊用途、不代表它本身字符意義的一組字符

利用元字符,我們可以控制字符串匹配的方式

比如上例中的\d,用來指定一個數字,"相當於[0-9],匹配任何單個的數字字符",而非d字母本身

  • 元字符各自含義

    正則表達式的完整元字符及各自的含義(主要有11個):

. ^ $ * + ? \ | { } [] ()

我們選挑重要的依次進行解釋

1.[ ] 方括號

(1) 常用來指定一個字符集,如[abcd]匹配:a或b或c或d

(2) 元字符在”[]”中不起所用,比如:[a+]匹配:a或+

(3) 補集匹配:[^a],匹配非a的一個字符

(4) 匹配連續字符:[a-zA-Z0-9],匹配大小寫英文字母和數字

2.^

匹配行首,直接匹配字符串中的每一個換行

3.$

匹配行尾,行尾是指:字符串尾,或一個換行字符後的任何位置

4.\

轉義字符,如果要匹配”\”本身,需要使用再次轉義:”\\”

一些特殊字符:

\d:匹配:[0-9]

\D:匹配:[^0-9],與 \d 相反,匹配任何非十進制數字的字符

\s:匹配:任何空白符,即:[\t\n\r\f\v]

\S:匹配:任何非空白符,即:[^\t\n\r\f\v]

\w:匹配:[a-zA-Z0-9_ ],即匹配任何字符

\W:匹配:[^a-zA-Z0-9_ ],與\w相反

5. *

匹配前一個字符或子表達式出現0次或多次

例如:ca*t 將匹配 ct(0 個字符 a),cat(1 個字符 a),caaat(3 個字符 a)

6. +

匹配前一個字符或子表達式出現1次或多次

例如: ca+t 會匹配 cat 和 caaat,但不會匹配 ct。

7.?

匹配前一個字符或子表達式出現1次或0次

例如 :大?帥哥 可以匹配 大帥哥,也可以匹配 帥哥。

8.{ }

匹配前一個字符或子表達式出現指定次數(即代表重復)

{0,}:0次或多次,相當於”*”

{1,}:1次或多次,相當於”+”

{0,1}:0次或1次,相當於”?”

{m,n}:m次到n次(m <= n),m是最少重復的次數,n是最多重復的次數

9. .

匹配除換行符以外的任意一個字符

10. |

每一種條件匹配一次,且"|"和"[]"效果是相同的,返回形式一樣

例如:

>>> print (re.findall(r"[abc]","abc"))

[‘a‘,‘b‘,‘c‘]

>>> print (re.findall(r"[a|b|c]","abc"))

[‘a‘,‘b‘,‘c‘]

11. ( )

圓括號分組匹配使得匹配返回元組

例如:

>>> print (re.findall(r"one two three four five six",a))

[‘one two three four five six‘]

>>> print (re.findall(r"(one) (two) (three) (four) (five) (six)",a))

[ ]返回空

  • python語言中的re模塊

在python語言中,re模塊用於提供正則表達式的全部功能,而re模塊中最重要的兩個函數是match()和re.search()

re.match()簡介

格式:re.match(pattern,string,flag=0),

技術分享圖片第一個參數pattern用於傳入需要匹配的模式定義字符串

技術分享圖片第二個參數string用於傳入被匹配和檢查的字符串內容

技術分享圖片第三個flag用於傳入標識,如是否區分大小寫

例1:

import re

print(re.match("\d\d\d\d-\d\d-\d\d","2018-03-09"))

運行結果:<_sre.SRE_Match object; span=(0, 10), match=‘2018-03-09‘>

代表2018-03-09符合我們定義的日期模式

例2:

import re

print(re.match("\d\d\d\d-\d\d-\d\d","2018-3-9"))

運行結果:NONE

代表不符合

思考一下,如何既滿足符合一個數字的月份和日又符合兩個數字的月份和日(見例3)

技術分享圖片

例3:

import re

print(re.match("\d\d\d\d-\d{1,2}-\d{1,2}","2018-3-9"))

如果看不懂,請返回到上節8.{}介紹部分

例4:

再思考一下,下面的代碼

import re

print(re.match("\d{4}-\d{1,2}-\d{1,2}","2018-3-9"))

例5:

思考一下,下面的代碼(可先看一下上一節\s和*的含義)

imprt re

print(re.match("\s*\d{4}-\d{1,2}-\d{1,2}"," 2017-05-08")

代碼是為了兼容日期前面如果出現多個空格的情況使用 \s*

例6:

import re

print(re.match("Dehom","Dehom Wang"))

回歸最簡單模式就是字符串本身,這很重要

補充知識:

Python中字符串前面加上 r 表示原生字符串,(r=raw)

Python裏的原生字符串很好地解決了需要\轉義字符這個問題,例如匹配一個數字的"\\d"可以寫成r"\d"。有了原生字符串,不用擔心是不是漏寫了反斜杠,寫出來的表達式也更直觀

python筆記-正則表達式