天天看點

python常用子產品-re子產品正規表達式re子產品常用方法

文章目錄

  • 正規表達式
    • 元字元
      • 字元比對
      • 比對次數
      • 位置錨定
      • 分組
        • 特殊分組用法
      • 選擇、轉義
      • Perl式元字元
  • re子產品常用方法
    • 比對模式标志位
    • 方法

正規表達式

正規表達式(Regular Expression,簡寫為RE,regex)是一種小型的、高度專業化的程式設計語言,在python中由内嵌的re子產品實作。正規表達式模式被編譯成一系列的位元組碼,然後由C編寫的比對引擎執行。

元字元

字元比對

  • .字元:比對任意單個字元
  • []:比對指定範圍内的任意單個字元
  • [^]:比對指定範圍外的任意單個字元

比對次數

  • *字元:比對前面的字元任意次數
  • ?:比對其前面的字元0或1次
  • +:比對前面的字元至少1次
  • {m,n}:比對前面的字元至少m次,至多n次

位置錨定

  • ^:行首錨定,用于模式的最左側
  • $:行尾錨定,用于模式的最右側

分組

  • ():表示将多個字元捆綁在一起作為一個整體來進行處理

特殊分組用法

  • \<number>:引用編号為的分組比對到字元串,預設會采取此分組方法
import re
x = re.search("([a-z]+)(\d+)","aaa333b444").group(1)
y = re.search("([a-z]+)(\d+)","aaa333b444").group(2)
z = re.findall("([a-z]+)(\d+)","aaa333b444")
print(x)
print(y)
#
aaa
333
[('aaa', '333'), ('b', '444')] #分組後傳回的值會被包含在清單中
           
  • (?P<name>):分組,除了原有的編号外再指定一個額外的别名,使用(?P=name),可以引用分組内容。
import re
x = re.search("(?P<alp>[a-z]+)(\d+)","aaa333b444").group("alp")
# 将第一個分組的名字定為“alp”
print(x)
#
aaa
           

選擇、轉義

  • |:表示比對管道符左右兩側任意一側
  • \: 表示将後面的字元轉化為普通字元或者特殊意義字元
關于轉義字元在python中的注意的點:比如’\b’這個字元串在python中本來的意思為倒退,而需要使用re元字元的意義,比對模式需要加一層轉義,‘\\b’;而如果’\b’作為一個普通字元串進行比對的時候需要這麼搜尋,re.findall(’\\\\b’,‘xxx\bx’)。

Perl式元字元

  • \d:表示比對任一數字,相當于[0-9]
  • \D:表示比對任一非數字,相當于[^0-9]
  • \s:表示比對任一空白字元,相當于[\t\n\r\f\v]
  • \S:表示比對任一非空白字元,相當于[^\t\n\r\f\v]
  • \w:表示比對任何字母數字字元
  • \W:表示比對任何非字母數字字元
  • \b:比對一個特殊字元邊界,比如空格,&,#等

re子產品常用方法

比對模式标志位

  • re.I 忽略大小寫
  • re.L 表示特殊字元集 \w, \W, \b, \B, \s, \S 依賴于目前環境
  • re.M 多行模式
  • re.S 即為 . 比對并且包括換行符在内的任意字元(. 不包括換行符)
  • re.U 表示特殊字元集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字元屬性資料庫
  • re.X 為了增加可讀性,忽略空格和 # 後面的注釋

方法

  • re.findall('pattern','string')

    此方法會找出所有比對的字元串,并傳回一個清單(若有分組,一比對項中的組會以元祖的形式包裹)
import re
x = re.findall("[a-z]+\d+","aaa333b444")
y = re.findall("([a-z]+)(\d+)","aaa333b444")
print(x)
print(y)
#
['aaa333', 'b444']
[('aaa', '333'), ('b', '444')] #分組後傳回的值會被包含在元祖中
           
import re
x = re.findall("www\.(baidu|163)\.com","kasjwww.baidu.comasdsd")
y = re.findall("www\.(?:baidu|163)\.com","kasjwww.baidu.comasdsd")
print(x)
print(y)
#結果
['baidu'] #findall會優先傳回分組中的内容
['www.baidu.com'] # ?:會取消分組的優先級
           
  • re.finditer('pattern','string')

    和 findall 類似,在字元串中找到正規表達式所比對的所有子串對象,并把它們作為一個疊代器傳回
import re
x = re.finditer("[a-z]+\d+","aaa333b444")
print(next(x).group())
#結果
# aaa333
           
  • re.search('pattern','string',flags=0)

    search,浏覽全部字元串,比對第一符合規則的字元串,比對成功會傳回一個比對對象,比對到的值儲存在group,groups,groupdict,三個對象的方法中,後兩者會比對有分組的比對中,未比對成功傳回None,flags表示比對模式标志位,具體參考上文。
import re
x = re. search("[a-z]+\d+","aaa333b444")
x1 = x.group()
print(x)
print(x1)
#結果
<_sre.SRE_Match object; span=(0, 6), match='aaa333'>
aaa333
#隻會比對到第1個滿足pattern的字元串
           
import re
y = re.search("(?P<name>[a-z]+)(\d+)","aaa333b444")
a1 = y.groups()
a2 = y.groupdict() #會傳回字典 格式{"分組名":"str"}
print(a1)
print(a2)
#結果
('aaa', '333')
{'name': 'aaa'}
           
  • re.match('pattern','string',flags=0)

    功能和search基本相同,不同的是match是從字元開頭開始比對,如果不是起始位置比對成功的話,match()就傳回none。
import re
x = re.match("([a-z]+)(\d+)","aaa333b444")
y = re.match("([a-z]+)(\d+)","1aaa333b444")
print(x)
print(y)
#結果
<_sre.SRE_Match object; span=(0, 6), match='aaa333'>
None
           
  • re.split(pattern, string[, maxsplit=0, flags=0])

    根據正則比對的字元串進行分割,傳回分割後的清單
import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.split("a", origin) #根據字元a分割字元串
print(r)
#輸出結果 ['hello ', 'lex bcd ', 'lex lge ', 'lex ', 'cd 19']
           
import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.split("a", origin) #根據字元a分割字元串
print(r)
#輸出結果 ['hello ', 'lex bcd ', 'lex lge ', 'lex ', 'cd 19']
           
import re
origin = "hello alex bcd alex lge alex 2acd 19"
r = re.split("a\w+", origin) #根據“a開頭的字元串”正則比對分割字元串
print(r)
#輸出結果 ['hello ', ' bcd ', ' lge ', ' 2', ' 19']
#将比對到的字元串作為分割标準進行分割
           
  • re.sub(pattern, repl, string, count=0, flags=0)

    用于替換字元串中的比對項,count表示替換次數,等于0表示全部替換,repl可以是一個函數
import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.sub("a","替換",origin) #替換比對成功的指定位置字元串
print(r)
#輸出結果
# hello 替換lex bcd 替換lex lge 替換lex 替換cd 19
           
  • re.subn(pattern, repl, string, count=0, flags=0)

    替換比對成功的指定位置字元串,并且傳回替換次數,可以用兩個變量分别接受
  • re.compile(pattern[, flags])

    compile 函數用于編譯正規表達式,生成一個正規表達式( Pattern )對象,供用于比對字元串,将pattern變為一個對象,對批量進行比對很有好處。
import re
origin = "hello alex bcd alex lge alex acd 19"
pattern = re.compile("a(\w+)")
r = pattern.search(origin)
print(r.group())
# 結果
# alex