python筆記-正則表達式
-
什麽是正則表達式:
正則表達式是一個特殊的字符序列,能幫助我們方便的檢查一個字符串是否與某種模式匹配(定義往往都很枯燥)
也稱之為”模式“,即可用於檢查一個給定的字符串是否符合某種模式
舉例:
我們定義一個模式,平常經常用到的日期模式: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筆記-正則表達式