正則表達式是對字符串操做的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。python
正則表達式是用來匹配字符串很是強大的工具,在其餘編程語言中一樣有正則表達式的概念,Python一樣不例外,利用了正則表達式,咱們想要從返回的頁面內容提取出咱們想要的內容就易如反掌了。正則表達式
正則表達式的大體匹配過程是:
1.依次拿出表達式和文本中的字符比較,
2.若是每個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。
3.若是表達式中有量詞或邊界,這個過程會稍微有一些不一樣。編程
符號 | 說明 | 實例 |
---|---|---|
. | 表示任意字符,若是說指定了 DOTALL 的標識,就表示包括新行在內的全部字符。 | 'abc' >>>'a.c' >>>結果爲:'abc' |
^ | 表示字符串開頭。 | 'abc' >>>'^abc' >>>結果爲:'abc' |
$ | 表示字符串結尾。 | 'abc' >>>'abc$' >>>結果爲:'abc' |
*, +, ? | '*'表示匹配前一個字符重複 0 次到無限次,'+'表示匹配前一個字符重複 1次到無限次,'?'表示匹配前一個字符重複 0 次到1次 | 'abcccd' >>>'abc*' >>>結果爲:'abccc'編程語言 'abcccd' >>>'abc+' >>>結果爲:'abccc'函數 'abcccd' >>>'abc?' >>>結果爲:'abc'工具 |
*?, +?, ?? | 前面的*,+,?等都是貪婪匹配,也就是儘量多匹配,後面加?號使其變成惰性匹配即非貪婪匹配 | 'abc' >>>'abc*?' >>>結果爲:'ab'spa 'abc' >>>'abc??' >>>結果爲:'ab'3d 'abc' >>>'abc+?' >>>結果爲:'abc'code |
{m} | 匹配前一個字符 m 次 | 'abcccd' >>>'abc{3}d' >>>結果爲:'abcccd' |
{m,n} | 匹配前一個字符 m 到 n 次 | 'abcccd' >>> 'abc{2,3}d' >>>結果爲:'abcccd' |
{m,n}? | 匹配前一個字符 m 到 n 次,而且取儘量少的狀況 | 'abccc' >>> 'abc{2,3}?' >>>結果爲:'abcc' |
\ | 對特殊字符進行轉義,或者是指定特殊序列 | 'a.c' >>>'a\.c' >>> 結果爲: 'a.c' |
[] | 表示一個字符集,全部特殊字符在其都失去特殊意義,只有: ^ - ] \ 含有特殊含義 | 'abcd' >>>'a[bc]' >>>結果爲:'ab' |
| | 或者,只匹配其中一個表達式 ,若是|沒有被包括在()中,則它的範圍是整個正則表達式 | 'abcd' >>>'abc|acd' >>>結果爲:'abc' |
( … ) | 被括起來的表達式做爲一個分組. findall 在有組的狀況下只顯示組的內容 | 'a123d' >>>'a(123)d' >>>結果爲:'123' |
(?#...) | 註釋,忽略括號內的內容 特殊構建不做爲分組 | 'abc123' >>>'abc(?#fasd)123' >>>結果爲:'abc123' |
(?= … ) | 表達式’…’以前的字符串,特殊構建不做爲分組 | 在字符串’ pythonretest ’中 (?=test) 會匹配’ pythonre ’ |
(?!...) | 後面不跟表達式’…’的字符串,特殊構建不做爲分組 | 若是’ pythonre ’後面不是字符串’ test ’,那麼 (?!test) 會匹配’ pythonre ’ |
(?<= … ) | 跟在表達式’…’後面的字符串符合括號以後的正則表達式,特殊構建不做爲分組 | 正則表達式’ (?<=abc)def ’會在’ abcdef ’中匹配’ def ’ |
(?:) | 取消優先打印分組的內容 | 'abc' >>>'(?:a)(b)' >>>結果爲'[b]' |
?P<> | 指定Key | 'abc' >>>'(?P<n1>a)>>>結果爲:groupdict{n1:a} |
特殊表達式序列 | 說明 |
---|---|
\A | 只在字符串開頭進行匹配。 |
\b | 匹配位於開頭或者結尾的空字符串 |
\B | 匹配不位於開頭或者結尾的空字符串 |
\d | 匹配任意十進制數,至關於 [0-9] |
\D | 匹配任意非數字字符,至關於 [^0-9] |
\s | 匹配任意空白字符,至關於 [ \t\n\r\f\v] |
\S | 匹配任意非空白字符,至關於 [^ \t\n\r\f\v] |
\w | 匹配任意數字和字母,至關於 [a-zA-Z0-9_] |
\W | 匹配任意非數字和字母的字符,至關於 [^a-zA-Z0-9_] |
\Z | 只在字符串結尾進行匹配 |
import re # . 通配符 print(re.findall("d..h","asdfghjkl")) # ^ 以什麼開頭 print(re.findall("^dh","dhasdfghjkl")) # $ 以什麼結尾 print(re.findall("dh$","dhasdfghjkldh")) # * [0,∞ ] print(re.findall("dha*","dhasdfghjkldh")) # + [1,∞ ] print(re.findall("dh+","dhasdfghjkldh")) # ? [0,1] print(re.findall("ghx?","dhasdfghxxxx")) # {0,}==* {1,}==+ {0,1}==? print(re.findall("ghx{4}","dhasdfghxxxx")) #重複x 4次 print(re.findall("ghx{1,4}","dhasdfghxx")) #重複x 1到4次 #注意,前面的*,+,?等都是貪婪匹配,也就是儘量的匹配,後面加?號使其變成惰性匹配 print(re.findall("ghx*?","dhasdfghxx")) #按最少的去匹配 print(re.findall("ghx+?","dhasdfghxx")) #按最少的去匹配 #---------------------------------------------------------------------------- #元字符之字符集[] 中口號中最少有一個,字符集中只有\,^,-是特殊符號 # [] 至關於或 print(re.findall("g[hz]","dhghafgzxx")) # - print(re.findall("[a-z]","dhghafgzxx")) print(re.findall("g[a-z]*","dhghafgzxx")) print(re.findall("g[0-9]*","g8dhghafgzxx")) # 字符集中的 ^ 至關於非 print(re.findall("g[^a-z]","sadffg54172"))
轉義字符
|
意義
|
ASCII碼值(十進制)
|
\a
|
響鈴(BEL)
|
007
|
\b
|
退格(BS) ,將當前位置移到前一列
|
008
|
\f
|
換頁(FF),將當前位置移到下頁開頭
|
012
|
\n
|
換行(LF) ,將當前位置移到下一行開頭
|
010
|
\r
|
回車(CR) ,將當前位置移到本行開頭
|
013
|
\t
|
水平製表(HT) (跳到下一個TAB位置)
|
009
|
\v
|
垂直製表(VT)
|
011
|
\\
|
表明一個反斜線字符''\'
|
092
|
\'
|
表明一個單引號(撇號)字符
|
039
|
\"
|
表明一個雙引號字符
|
034
|
\? |
表明一個問號 |
063 |
\0
|
空字符(NULL)
|
000
|
\ooo
|
1到3位八進制數所表明的任意字符
|
三位八進制
|
\xhh
|
1到2位十六進制所表明的任意字符
|
二位十六進制
|
正則表達式是對字符串的最簡約的規則的表述。python也有專門的正則表達式模塊re.對象
正則表達式函數 | 釋義 |
re.match() | 從頭開始匹配,匹配失敗返回None,匹配成功可經過group(0)返回匹配成功的字符串 |
re.search() | 掃描整個字符串,並返回第一個匹配的字符串 |
re.sub() | 對符合要求的全部子串進行替換 |
re.findall() | 以列表形式返回全部符合條件的子串 |
re.split() | 以模式做爲切分符號切分字符串,並返回列表 |
re.finditer() | 找到 RE 匹配的全部子串,並把它們做爲一個迭代器返回 |
re.compile() | 把那些常常使用的正則表達式編譯成正則表達式對象 |
re.group() | 返回被 RE 匹配的字符串 |
re.start() | 返回匹配開始的位置 |
re.end() | 返回匹配結束的位置 |
re.span() | 返回一個元組包含匹配 (開始,結束) 的位置 |
#返回全部知足條件的匹配結果,再放列表裏 print(re.findall("[a-z]","dhghafgzxx"))
# re.search 匹配字符串裏面的,只要找到一個就再也不日後面找了 # ?P<name> 固定格式 name是分組的名稱 # 注意res是一個對象 # 經過調用group方法取出對象中的結果 res = re.search("(?P<name>[a-z]+)(?P<age>\d+)", "szx18alex38") print(res.group("age"))
#從頭開始匹配,匹配失敗返回None,匹配成功可經過group(0)返回匹配成功的字符串 print(re.match('\d+' ,'1342abcccd' ).group()) #1342
#先按"a"分割獲得""和"bcd",在對""和"bcd"分別按"b"進行分割 print(re.split('[ab]' ,'abcd' )) #['', '', 'cd']
#替換 2表示替換幾回 print(re.sub('\d','A' ,'1342abcccd',2))
#把結果作成一個元祖,第一個是匹配的內容,第二個是匹配的次數 print(re.subn('\d','A' ,'1342abcccd',2))
#把那些常常使用的正則表達式編譯成正則表達式對象 com = re.compile('\d+') print(com.findall("eubc114"))
#找到 RE 匹配的全部子串,並把它們做爲一個迭代器返回 rec = re.finditer("\d","eubc114") for i in rec: print(i)
#分組提取() 優先提取分組的值
print(re.findall("www\.(baidu|163)\.com","www.baidu.com")) #['baidu']
print(re.findall("www\.(?:baidu|163)\.com","www.baidu.com"))#['www.baidu.com']