正則表達(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)單看一看就可以上手了。
使用單個(gè)字符串來(lái)描述匹配一系列符合某個(gè)句法規(guī)則的字符串
是對(duì)字符串操作的一種邏輯公式
應(yīng)用場(chǎng)景:處理文本和數(shù)據(jù)
正則表示是過程:依次拿出表達(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()' '
字符 | 匹配 |
---|---|
* | 匹配前一個(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'
| 匹配左右任意一個(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.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'
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)載!
更多建議: