python之正則表達式

正則表達式

正則表達式是對字符串操做的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。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位十六進制所表明的任意字符
二位十六進制

re模塊下的方法

正則表達式是對字符串的最簡約的規則的表述。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() 返回一個元組包含匹配 (開始,結束) 的位置

re.fandall

#返回全部知足條件的匹配結果,再放列表裏
print(re.findall("[a-z]","dhghafgzxx"))

re.search

# re.search  匹配字符串裏面的,只要找到一個就再也不日後面找了
# ?P<name>  固定格式 name是分組的名稱
# 注意res是一個對象
# 經過調用group方法取出對象中的結果
res = re.search("(?P<name>[a-z]+)(?P<age>\d+)", "szx18alex38")
print(res.group("age"))

 re.match

#從頭開始匹配,匹配失敗返回None,匹配成功可經過group(0)返回匹配成功的字符串
print(re.match('\d+' ,'1342abcccd' ).group()) #1342

 re.split

#先按"a"分割獲得""和"bcd",在對""和"bcd"分別按"b"進行分割
print(re.split('[ab]' ,'abcd' ))  #['', '', 'cd']

 re.sub

#替換 2表示替換幾回
print(re.sub('\d','A' ,'1342abcccd',2))

 re.subn

#把結果作成一個元祖,第一個是匹配的內容,第二個是匹配的次數
print(re.subn('\d','A' ,'1342abcccd',2))

 re.compile

#把那些常常使用的正則表達式編譯成正則表達式對象
com = re.compile('\d+')
print(com.findall("eubc114"))

 re.finditer

#找到 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']

相關文章
相關標籤/搜索