正規表示式 regular expression
# 正規表示式 支援的所有元字元:
# . ^ $ * + ? {} \ | ()
# . 匹配任何乙個字元(而不是標點符號) 。多行模式下\n除外。單行模式下.可以匹配\n
# \ 轉義符,eg.想精確匹配"." 可以"\."
# \b 匹配乙個位置(同 ^ $),單詞的開始或結束
# \d 匹配任何乙個十進位制數字,相當於[0-9]
# \d 匹配任何乙個非十進位制數字,相當於[^0-9]
# \s 匹配任何乙個空白字元,相當於[\t\n\r\f\v]
# \s 匹配任何乙個非空白字元,相當於[^\t\n\r\f\v]
# \w 匹配任何乙個字母數字字元,相當於[a-za-z0-9_]
# \w 匹配任何乙個非字母數字字元,相當於[^a-za-z0-9_]
# 匹配任何一類字元
# eg.[abcd]將匹配 'a' 'b' 'c' 'd' 中的任意乙個字元, [.?!] 匹配標點符號
# 可加"-"表示範圍, eg.[a-d] 同 [abcd]
# * 重複匹配前面乙個字元 "0-無窮多" 次(預設匹配盡可能長,*? 則匹配盡可能短), eg 1*2 可以匹配 2 12 112 1112 11112 111112 ...
# + 重複匹配前面乙個字元 "1-無窮多" 次(預設匹配盡可能長,+? 則匹配盡可能短), eg 1+2 可以匹配 12 112 1112 11112 111112 ...
# ? 重複匹配前面乙個字元 "0-1" 次(預設匹配盡可能長,?? 則匹配盡可能短), eg 1?2 可以匹配 2 12
# 還有乙個作用: ?" 表示接下來匹配到 " 之後就不再繼續匹配,這對於 "abc"."def" 這種只想拿到"abc" 的case很有用
# 這對於左右括號,左右引號之類的模式匹配很有用
# {} 重複匹配前面乙個字元 指定範圍 次(預設匹配盡可能長,{}? 則匹配盡可能短), 算上前乙個字元一共
# eg.12 可以匹配 1112, 而 1可以匹配1112 11112 111112, 12 則可以匹配 1112 11112 111112 1111112 ...
# eg.\d 可以匹配八個數字 -------------------------??? 八個不是九個
# ^ 多行模式下代表一行的起始,相當於是\n之後的那個字元,單行模式下代表整個字串的開始。 放在中相當於取反[^x]
# $ 多行模式下代表一行的末尾,相當於是\n,單行模式下代表整個字串的結束 eg.匹配一行就是 "^.*$" 不過python可以直接用split("\n")
# | 相當於或,任意乙個正規表示式匹配上就算匹配上
# () 分組,告訴 {} 需要重複的target, 匹配之後的字串也會按照 組 的方式
# eg.匹配乙個ip位址 (eg. 192.168.0.1):
# \d\.\d\.\d\.\d
# (\d\.)\d #當獲取了這個字串的時候,('192','168','0','1')會被組織成乙個元組
#乙個例子:提取存檔的html檔案中所有的**
# http:// 開頭,或者 https:// 開頭,然後是任意乙個字元,(重複任意次),**一般被""包起來
import re
#1) re.i(re.ignorecase): 忽略大小寫
#2) re.m(multiline): 多行模式,改變』^』和』$』的行為
#3) re.s(dotall): 點任意匹配模式,改變』.』的行為
#4) re.l(locale): 使預定字元類 \w \w \b \b \s \s 取決於當前區域設定
#5) re.u(unicode): 使預定字元類 \w \w \b \b \s \s \d \d 取決於unicode定義的字元屬性
#6) re.x(verbose): 詳細模式。這個模式下正規表示式可以是多行,忽略空白字元,並可以加入注釋
p = re.compile('"https?://.*?"', re.ignorecase) # ?" 表示找到離前面乙個"最近的"之後就不再繼續匹配
#p = re.compile('"http://.*?"|"https://.*?"', re.i) # re.ignorecase 和 re.i 都表示忽略大小寫
with open("/home/fang/桌面/demo.html") as fr:
doc = fr.read()
print(type(doc))
# findall() 找到所有匹配的字串,作為乙個list返回
# search() 掃瞄字串,找到re匹配的位置(只返回第乙個的位置)
# p.match(doc) 會返回乙個match物件(不包含pattern應該返回none吧)
for i in p.findall(doc):
print (type(i), i)
除了上面 findall函式外,還有幾個常用的:
re.match(pattern, string, flags=0)
或rp = re.compile(pattern, re.i | re.s)
mobj = rp.match(string) #預設從 pos=0 出開始匹配,pos=0除匹配不上就認為匹配失敗,endpos=len(string)為預設的停止匹配位置
rp = re.compile(pattern, re.i | re.s)
mobj = rp.search(string) #search 直接從給定字串中查詢匹配的位置,找到就直接返回不再繼續查詢了
rp = re.compile(pattern, re.i | re.s)
res = list(rp.finditer(string)) # 類似 search,不同的是是搜尋全部,返回乙個迭代器,這裡直接轉化為 matchobject 組成的 list
返回 matchobject
拿到 matchobject(比如是 mobj),你可以:
使用 mobj.group()或 mobj.group(0) 獲取匹配的字串
使用 mobj.group(i)獲取匹配字串中的第i個子group(前提是 pattern 中有"(xx)"),或 mobj.groups() 獲取子group組成的元組
使用 mobj.span() 獲取匹配字串位於原始字串中的index,即 (start,end),或 單獨使用 mobj.start() mobj.end()
content = "hello , this is a test string"
p = re.compile(r'\w*is', re.i)
for i in p.findall(content):
print(i) # 返回 this 和 is
for i in range(len(content)):
res = p.match(content,i) # 預設從pos=0開始匹配,pos=0處匹配不上就認為匹配失敗,endpos=len(string)為預設的停止匹配位置
if res:
print("found,{},{}".format(res.group(),res.span()))
else:
print("not found at {}".format(i))
res = p.search(content) # search 直接從給定字串中查詢匹配的起始位置,找到就返回不再繼續找了
if res:
print("found,{},{}".format(res.group(),res.span()))
else:
print("not found")
res = list(p.finditer(content)) # 返回所有匹配的位置 span()
print(res)
for i in res:
print("type {}, {}, {}".format(type(i), i, i.span()))
正規表示式匹配字串
正規表示式用於字串處理 表單驗證等場合,實用高效。現將一些常用的表示式收集於此,以備不時之需。匹配中文字元的正規表示式 u4e00 u9fa5 評注 匹配中文還真是個頭疼的事,有了這個表示式就好辦了 匹配雙位元組字元 包括漢字在內 x00 xff 評注 可以用來計算字串的長度 乙個雙位元組字元長度計...
正規表示式匹配 字串
正規表示式匹配字串 假使,有幾個需要驗證的字串用 連線在一起 形如 farmer1,1farmer234 想用正規表示式來匹配每乙個字串。private static string sourcestr farmer1,1farmer234 private static string key farm...
字串教程 正規表示式
正規表示式適合很多種語言不單單是c 匹配除換行符以外的任意字元 w 匹配字母,數字,下劃線,漢字 w 小w的補集 就是和小w相反的 s 匹配 任意空白符 包括換行符 n,回車符 r,製表符 t,垂直製表符 v,換頁符 f d 匹配數字 0 9數字 abc 匹配括號中的字元 a c a字元到c字元 x...