python筆記(2) 正規表示式

weixin_34138377發表於2017-02-20

1

正規表示式在Python中最好以r'xx'這樣的形式作為輸入,這能避免反斜槓()使用混亂。以r開頭的字串,在python中是原始字串(raw string)的意思。

特殊字元 解釋 例子
. 匹配所有字元不包括換行(如果DOTALL沒有設定的話)
^ 匹配字串的開頭,在MULTILINE模式下匹配每行的開頭
$ 匹配字串的結尾,在MULTILINE模式下匹配每個新行的開頭
* 匹配0或者多個前置正規表示式
+ 匹配1或者多個前置正規表示式
? 匹配0或者1個前置正規表示式
*?, +?, ?? *,+,?都是貪婪的,加了?能改變著模式
m 匹配m個前置表示式
{m,n} 匹配m到n個前置表示式
{m,n}? 改變 {m,n}貪婪模式
\ 轉義特殊字元
[] 定義匹配集合,特殊字元(例如(+*))在集合中失去特殊意義,使用-可以匹配一個序列,如果-放在集合的開頭或者轉義就能匹配-^放在開頭可以翻轉整個匹配,匹配]要麼放在開頭要麼轉義
豎線 或匹配
(...) 匹配括號中的字串,形成一個組(````)
(?:...) 只匹配字串但是不記錄匹配的內容
(?P<name>...) 匹配之後形成一個組,組名為name
(?=...) 超前匹配
(?!...) 超前不匹配
(?<=...) 滯後匹配
(?<!...) 滯後不匹配
\number 引用一個組
\A 字串的開頭匹配
\b 匹配空字元,在開始和結束處
\B 匹配空字元,不在開始和結束處
\d 匹配數字0-9
\D 匹配非數字
\s 匹配空字元,相當於[ \t\n\r\f\v]
\S 與\s相反
\w [a-zA-Z0-9_]
\W 與\w相反
\Z 匹配字串的結尾
\u Unicode字元
貪婪模式

正規表示式預設的情況是貪婪的,所謂貪婪就是儘量多匹配也可以叫最長匹配,但是有時候這又是不合適的.

3797605-2d303abed2af7c9d.png
貪婪模式

2

正規表示式的使用,可以先編譯正規表示式然後呼叫方法,也可以直接從re模組呼叫方法。

pattern = re.compile(r'dongge')
m = pattern.match('dongge zeus')
#或者
m = re.match(r'dongge','dongge zeus')
match,search,fullmatch

這三個函式返回值都是match物件,match從頭開始匹配,fullmatch匹配整個,search匹配第一個。

import re
test_str = 'abcd 1234 dongge'
pattern = re.compile(r'1234')
pattern.match(test_str)
pattern.search(test_str)
<_sre.SRE_Match object; span=(5, 9), match='1234'>
pattern.fullmatch(test_str)
p1 = re.compile(r'abcd')
p1.match(test_str)
<_sre.SRE_Match object; span=(0, 4), match='abcd'>
p1.search(test_str)
<_sre.SRE_Match object; span=(0, 4), match='abcd'>
p1.fullmatch(test_str)
p1.fullmatch(test_str,0,4)
<_sre.SRE_Match object; span=(0, 4), match='abcd'>

(注:上面的程式碼來自jupyter notebook)

split findall finditer

這三個函式都返回一個列表。

  • 分割字串split
re.split('\W+', 'Words, words, words.')
['Words', 'words', 'words', '']
re.split('(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']

注意程式碼中的第三行,在正規表示式中加了分組之後,那個分割元素也成了返回值。

  • 查詢所有匹配的元素findall
test_str = 'dongge , dongge ,zeus'
re.findall(r'dongge',test_str)
['dongge', 'dongge']
  • 迭代查詢元素finditer
3797605-0f4429d61b570403.png
迭代查詢
sub subn

sub(pattern, repl, string, count=0, flags=0)
這兩個函式有查詢和替換功能,repl這個引數既可以是字串也可以是一個函式,函式接收一個match object

3797605-efe7f5e73484cfd4.png
查詢替換

3

Match Object這在上面多次提到,如果一個函式返回這個物件,那麼判斷值肯定就是True
這個物件最重要的概念就是group,相關函式作用在下面截圖中。

3797605-d0b4211ab1bc4c9c.png
group
  • start([group]) end([group]) span([group])
    這裡三個函式都是用來計算group的位置,span返回的一個元組(start,end),group預設值是0。
3797605-1f733ba6f480f7cb.png
Paste_Image.png

相關文章