正規表示式

2021-09-26 06:39:14 字數 3247 閱讀 4539

當我們需要在一大堆字串中搜尋某些內容的時候可以考慮使用正規表示式(regular expression)。正規表示式描述了一種字串匹配的模式(pattern),可以用來檢查乙個字串是否含有某些內容(子串)、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。

py+thon #可以匹配python, pyython,pyyython等,+表示前面的字元必須至少出現一次(一次或多次)

py?thon #可以匹配python, pthon,?表示前面的字元最多出現一次(0次或一次)

py*thon #可以匹配pthon,python, pyython,pyyython等,*表示前面的字元可以出現任意次(0,1,2。。次)

上面是最簡單的正規表示式。

正規表示式裡面的內容分為以下幾個部分

沒有顯示指定為元字元的所有可列印和不可列印字元,包括所有大小寫字母,數字,標點符號,以及一些其他符號。

非列印字元

字元描述

\cx匹配由x指明的控制字元。例如, \cm 匹配乙個 control-m 或回車符。x 的值必須為 a-z 或 a-z 之一。否則,將 c 視為乙個原義的 『c』 字元。

\f匹配乙個換頁符。等價於 \x0c 和 \cl。

\n匹配乙個換行符。等價於 \x0a 和 \cj。

\r匹配乙個回車符。等價於 \x0d 和 \cm。

\s匹配任何空白字元,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。注意 unicode 正規表示式會匹配全形空格符。

\s匹配任何非空白字元。等價於 [^ \f\n\r\t\v]。

\t匹配乙個製表符。等價於 \x09 和 \ci。

\v匹配乙個垂直製表符。等價於 \x0b 和 \ck。

有特殊含義的字元。比如上面例子中的+,表示乙個或多個前面字元。如果要搜尋帶+子串,需要對+進行轉義,將正規表示式中+前面加上\改為+

定位符字元描述^

匹配輸入字串的開始位置,除非在方括號表示式中使用,此時它表示不接受該字元集合。要匹配 ^ 字元本身,請使用\ ^。

$匹配輸入字串的結尾位置。如果設定了 regexp 物件的 multiline 屬性,則 $ 也匹配 『\n』 或 『\r』。要匹配 $ 字元本身,請使用 \$。

\b匹配乙個單詞邊界,即字與空格間的位置。

\b非單詞邊界匹配。

限定符指定正規表示式的乙個給定元件必須要出現多少次才能滿足匹配

字元描述

*匹配前面的子表示式零次或多次。要匹配 * 字元,請使用\ *。

+匹配前面的子表示式一次或多次。要匹配 + 字元,請使用\ +。

?匹配前面的子表示式零次或一次,或指明乙個非貪婪限定符。要匹配 ? 字元,請使用 \?。

n 是乙個非負整數。匹配確定的 n 次。

n 是乙個非負整數。至少匹配n 次。

m和n 是乙個非負整數。至少匹配 n 次,最多匹配m次。

* + 都是貪婪的,會盡可能多的匹配字元,如果在他們後面加上?就可以實現最小匹配。

# 初始字串

<.*> # 返回值是:

<.*?> # 返回值是:

例子import re

s='sxjjsgl.(sxjsgl)'

res=re.match('s.*\()',s) # 返回值res=re.match('x.*$',s) # 返回值none

res.group() # 獲取整個pattern匹配的值,如果pattern中有(),可以使用group(1)獲取的定括號內的內容

res.span() #獲取匹配範圍和group對應

res.start()

res.end() #與group對應返回索引的結束位置

嘗試從字串的起始位置匹配乙個模式,如果不是起始位置匹配成功的話,match()就返回none,還有一種使用方法:

p = re.compile(pattern) #生成正則物件

res = p.match(string) # 匹配字串,

re中的方法均可以使用上面兩種方式,需要注意findall,兩種方法略有不同

搜尋(search,match,findall,finditer)

res=research(pattern,string,flags=0) # 返回匹配的第乙個字串

res=re.search('s.*j',s) # 返回貪婪模式

res=re.search('s.*?j',s) # 返回非貪婪模式

res=re.match(pattern,string,flags) # match 只匹配字串的開始,search則匹配整個字串

res=pattern.findall(string,pos,endpos) # 在字串中找到正規表示式所匹配的所有子串,並返回乙個列表,如果沒有找到匹配的,則返回空列表。pos : 可選引數,指定字串的起始位置,預設為 0。endpos : 可選引數,指定字串的結束位置,預設為字串的長度。注意: match 和 search 是匹配一次 findall 匹配所有。

res=re.findall('sxj',s) # 返回:['sxj', 'sxj']

res=re.finditer(pattern,string,flags=0) # 和findall類似,只不過返回的是迭代器

替換(sub)

res=re.sub(pattern,repl,string,count=0) # repl可以是字串或函式,是替代的字元count代表替換的次數,預設0表示替換所有

res=re.sub('sxj','mm',s,count=1) # 返回值:『mmjsgl.(sxjsgl)』

分割(split)

res=re.split(pattern,string,maxsplit=0,flags=0) # 按照匹配的字串分割並返回列表,maxsplit表示分隔次數,預設為0,表示不限制次數。

res=re.split('sxj',s) # 返回:['', 'jsgl.(', 'sgl)']

flag標誌位,用於控制正規表示式的匹配方式,可選引數有:

re.i #忽略大小寫

re.l #表示特殊字符集\w,\w,\b,\b,\s,\s做本地化匹配

re.m # 表示多行模式

re.s # 使.能匹配包括換行符在內的任意字元

re.u # 根據unicode字符集解析字元。這個標誌影響 \w, \w, \b, \b.

re.x # 為了增加可讀性,忽略空格和 # 後面的注釋

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...

Linux正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...