Python正則表達(dá)式re模塊

2018-06-08 17:18 更新

正則表達(dá)式并不是Python的一部分。正則表達(dá)式是用于處理字符串的強(qiáng)大工具,擁有自己獨(dú)特的語(yǔ)法以及一個(gè)獨(dú)立的處理引擎,效率上可能不如str自帶的方法,但功能十分強(qiáng)大。得益于這一點(diǎn),在提供了正則表達(dá)式的語(yǔ)言里,正則表達(dá)式的語(yǔ)法都是一樣的,區(qū)別只在于不同的編程語(yǔ)言實(shí)現(xiàn)支持的語(yǔ)法數(shù)量不同;但不用擔(dān)心,不被支持的語(yǔ)法通常是不常用的部分。如果已經(jīng)在其他語(yǔ)言里使用過正則表達(dá)式,只需要簡(jiǎn)單看一看就可以上手了。

正則表達(dá)式概念

  1. 使用單個(gè)字符串來(lái)描述匹配一系列符合某個(gè)句法規(guī)則的字符串

  2. 是對(duì)字符串操作的一種邏輯公式

  3. 應(yīng)用場(chǎng)景:處理文本和數(shù)據(jù)

  4. 正則表示是過程:依次拿出表達(dá)式和文本中的字符比較,如果每一個(gè)字符都能匹配,則匹配成功;否則匹配失敗

字符匹配

字符描述
.匹配任意一個(gè)字符(除了\n)
\d \D數(shù)字/非數(shù)字
\s \S空白/非空白字符
\w \W單詞字符[a-zA-Z0-9]/非單詞字符
\b \B單詞邊界,一個(gè)\w與\W之間的范圍,順序可逆/非單詞邊界
  • 匹配任意一個(gè)字符

 # 匹配字符串a(chǎn)bc,.代表b >>> re.match('a.c','abc').group()'abc'
  • 數(shù)字與非數(shù)字

 # 匹配任意一數(shù)字 >>> re.match('\d','1').group()'1' # 匹配任意一個(gè)非數(shù)字 >>> re.match('\D','a').group()'a'
  • 空白與非空白字符

 # 匹配任意一個(gè)空白字符 >>> re.match("\s"," ").group()' ' # 匹配任意一個(gè)非空白字符 >>> re.match("\S","1").group()'1' >>> re.match("\S","a").group()'a'
  • 單詞字符與非單詞字符

單詞字符即代表[a-zA-Z0-9]

 # 匹配任意一個(gè)單詞字符 >>> re.match("\w","a").group()'a' >>> re.match("\w","1").group()'1' # 匹配任意一個(gè)非單詞字符 >>> re.match("\W"," ").group()' '

次數(shù)匹配

字符匹配
*匹配前一個(gè)字符0次或者無(wú)限次
+匹配前一個(gè)字符1次或者無(wú)限次
?匹配前一個(gè)字符0次或者1次
{m}/{m,n}匹配前一個(gè)字符m次或者N次
*?/+?/??匹配模式變?yōu)樨澙纺J剑ūM可能少匹配字符)
  • 介紹

字符匹配
prev?0個(gè)或1個(gè)prev
prev*0個(gè)或多個(gè)prev,盡可能多地匹配
prev*?0個(gè)或多個(gè)prev,盡可能少地匹配
prev+1個(gè)或多個(gè)prev,盡可能多地匹配
prev+?1個(gè)或多個(gè)prev,盡可能少地匹配
prev{m}m個(gè)連續(xù)的prev
prev{m,n}m到n個(gè)連續(xù)的prev,盡可能多地匹配
prev{m,n}?m到n個(gè)連續(xù)的prev,盡可能少地匹配
[abc]a或b或c
[^abc]非(a或b或c)
  • 匹配前一個(gè)字符0次或者無(wú)限次

 >>> re.match('[A-Z][a-z]*','Aaa').group()'Aaa' >>> re.match('[A-Z][a-z]*','Aa').group()'Aa' >>> re.match('[A-Z][a-z]*','A').group()'A'
  • 匹配前一個(gè)字符1次或者無(wú)限次

 # 匹配前一個(gè)字符至少一次,如果一次都沒有就會(huì)報(bào)錯(cuò) >>> re.match('[A-Z][a-z]+','A').group()Traceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: 'NoneType' object has no attribute 'group'
 >>> re.match('[A-Z][a-z]+','Aa').group()'Aa' >>> re.match('[A-Z][a-z]+','Aaaaaaa').group()'Aaaaaaa'
  • 匹配前一個(gè)字符0次或者1次

 >>> re.match('[A-Z][a-z]?','A').group()'A' # 只匹配出一個(gè)a >>> re.match('[A-Z][a-z]?','Aaaa').group()'Aa'
  • 匹配前一個(gè)字符m次或者N次

 #匹配前一個(gè)字符至少5次 >>> re.match('\w{5}','asd234').group()'asd23' # 匹配前面的字符6-10次 >>> re.match('\w{6,10}','asd234').group()'asd234' # 超過的字符就匹配不出來(lái) >>> re.match('\w{6,10}','asd2313qeadsd4').group()'asd2313qea'
  • 匹配模式變?yōu)樨澙纺J?/p>

 >>> re.match(r'[0-9][a-z]*','1bc').group()'1bc' # *?匹配0次或者多次 >>> re.match(r'[0-9][a-z]*?','1bc').group()'1' # +?匹配一次或者多次,但是只匹配了一次 >>> re.match(r'[0-9][a-z]+?','1bc').group()'1b' # ??匹配0次或者一次 >>> re.match(r'[0-9][a-z]??','1bc').group()'1'

貪婪匹配和非貪婪匹配

邊界匹配

字符匹配
^匹配字符串開頭
$匹配字符串結(jié)尾
\A \Z指定的字符串必須出現(xiàn)在開頭/結(jié)尾
  • 匹配字符串開頭

 # 必須以指定的字符串開頭,結(jié)尾必須是@163.com >>> re.match('^[\w]{4,6}@163.com$','asdasd@163.com').group()'asdasd@163.com'
  • 匹配字符串結(jié)尾

 # 必須以.me結(jié)尾 >>> re.match('[\w]{1,20}.me$','ansheng.me').group()'ansheng.me'
  • 指定的字符串必須出現(xiàn)在開頭/結(jié)尾

 >>> re.match(r'\Awww[\w]*\me','wwwanshengme').group()'wwwanshengme'

正則表達(dá)式分組匹配

  • | 匹配左右任意一個(gè)表達(dá)式

 >>> re.match("www|me","www").group()'www' >>> re.match("www|me","me").group()'me'
  • (ab) 括號(hào)中表達(dá)式作為一個(gè)分組

# 匹配163或者126的郵箱 >>> re.match(r'[\w]{4,6}@(163|126).com','asdasd@163.com').group()'asdasd@163.com' >>> re.match(r'[\w]{4,6}@(163|126).com','asdasd@126.com').group()'asdasd@126.com'
  • (?P

    ) 分組起一個(gè)別名
 >>> re.search("(?P<zimu>abc)(?P<shuzi>123)","abc123").groups()('abc', '123')
  • 引用別名為name的分組匹配字符串

 >>> res.group("shuzi")'123' >>> res.group("zimu")'abc'

re模塊常用的方法

  • re.match()

語(yǔ)法格式:

match(pattern, string, flags=0)

釋意:

Try to apply the pattern at the start of the string, returning a match object, or None if no match was found.

實(shí)例:

 # 從頭開始匹配,匹配成功則返回匹配的對(duì)象 >>> re.match("abc","abc123def").group()'abc' 
 # 從頭開始匹配,如果沒有匹配到對(duì)應(yīng)的字符串就報(bào)錯(cuò) >>> re.match("\d","abc123def").group()Traceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: 'NoneType' object has no attribute 'group'
  • re.search()

語(yǔ)法格式:

search(pattern, string, flags=0)

釋意:

Scan through string looking for a match to the pattern, returning a match object, or None if no match was found.

實(shí)例:

 # 匹配整個(gè)字符串,匹配到第一個(gè)的時(shí)候就返回匹配到的對(duì)象 >>> re.search("\d","abc1123def").group()'1'
  • re.findall()

語(yǔ)法格式:

findall(pattern, string, flags=0)

釋意:

Return a list of all non-overlapping matches in the string.

實(shí)例:

 # 匹配字符串所有的內(nèi)容,把匹配到的字符串以列表的形式返回 >>> re.findall("\d","abc123def456")['1', '2', '3', '4', '5', '6']
  • re.split

語(yǔ)法格式:

split(pattern, string, maxsplit=0)

釋意:

Split the source string by the occurrences of the pattern, returning a list containing the resulting substrings.

實(shí)例:

 # 指定以數(shù)字進(jìn)行分割,返回的是一個(gè)列表對(duì)象 >>> re.split("\d+","abc123def4+-*/56")['abc', 'def', '+-*/', ''] # 以多個(gè)字符進(jìn)行分割 >>> re.split("[\d,]","a,b1c")['a', 'b', 'c']
  • re.sub()

語(yǔ)法格式:

sub(pattern, repl, string, count=0)

釋意:

Return the string obtained by replacing the leftmost non-overlapping occurrences of the pattern in string by the replacement repl. repl can be either a string or a callable;
if a string, backslash escapes in it are processed. If it is a callable, it’s passed the match object and must return a replacement string to be used.

實(shí)例:

 # 把a(bǔ)bc替換成def 
 >>> re.sub("abc","def","abc123abc")'def123def' 
 # 只替換查找到的第一個(gè)字符串 
 >>> re.sub("abc","def","abc123abc",count=1)'def123abc'

實(shí)例

string方法包含了一百個(gè)可打印的ASCII字符,大小寫字母、數(shù)字、空格以及標(biāo)點(diǎn)符號(hào)

 >>> import string >>> printable = string.printable >>> printable'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
 >>> import re 
 # 定義的字符串 
 >>> source = '''I wish I may, I wish I migth... Hava a dish of fish tonight.''' 
 # 在字符串中檢索wish 
 >>> re.findall('wish',source)['wish', 'wish'] 
 # 對(duì)源字符串任意位置查詢wish或者fish 
 >>> re.findall('wish|fish',source)['wish', 'wish', 'fish'] 
 # 從字符串開頭開始匹配wish 
 >>> re.findall('^wish',source)    [] 
 # 從字符串開頭匹配I wish 
 >>> re.findall('^I wish',source)['I wish'] 
 # 從字符串結(jié)尾匹配fish 
 >>> re.findall('fish$',source)   [] 
 # 從字符串結(jié)尾匹配fish tonight. 
 >>> re.findall('fish tonight.$',source)['fish tonight.'] 
 # 查詢以w或f開頭,后面緊跟著ish的匹配 
 >>> re.findall('[wf]ish',source)['wish', 'wish', 'fish'] 
 # 查詢以若干個(gè)w\s\h組合的匹配 
 >>> re.findall('[wsh]+',source) ['w', 'sh', 'w', 'sh', 'h', 'sh', 'sh', 'h'] 
 # 查詢以ght開頭,后面緊跟著一個(gè)非數(shù)字和字母的匹配 
 >>> re.findall('ght\W',source)['ght.'] 
 # 查詢已以I開頭,后面緊跟著wish的匹配 
 >>> re.findall('I (?=wish)',source)['I ', 'I '] 
 # 最后查詢以wish結(jié)尾,前面為I的匹配(I出現(xiàn)次數(shù)盡量少) 
 >>> re.findall('(?<=I) wish',source)[' wish', ' wish']
  • 匹配時(shí)不區(qū)分大小寫

 >>> re.match('a','Abc',re.I).group()'A'
  • r 源字符串,轉(zhuǎn)義,如果要轉(zhuǎn)義要加兩個(gè)\n

 >>> import re 
 >>> pa = re.compile(r'yangwen') 
 >>> pa.match("yangwen.me")
 <_sre.SRE_Match object; span=(0, 7), match='yangwen'> 
 >>> ma = pa.match("yangwen.me") 
 >>> ma
 <_sre.SRE_Match object; span=(0, 7), match='yangwen'> 
 # 匹配到的值存到group內(nèi) 
 >>> ma.group()'yangwen' 
 # 返回字符串的所有位置 
 >>> ma.span()
 (0, 7) 
 # 匹配的字符串會(huì)被放到string中 
 >>> ma.string
 'yangwen.me' 
 # 實(shí)例放在re中 
 >>> ma.rere.compile('yangwen')


本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)