正規表示式用於搜尋、替換和解析字串。正規表示式遵循一定的語法規則,使用非常靈活,功能強大。使用正規表示式編寫一些邏輯驗證非常方便,例如電子郵件位址格式的驗證。python提供了re模組實現正規表示式的驗證。
1.簡介
正規表示式是用於文字匹配的工具,它在源字串中查詢與給定的正規表示式相匹配的部分,乙個正規表示式是由字母、數字和特殊字元(括號、星號、問號)組成,正規表示式中有許多特殊的字元,這些特殊字元是構成正規表示式的要素。
正規表示式中的特殊字元:
^ —–正規表示式的開始符號
$ —–正規表示式的結束符號
\w ——匹配字母、數字、下劃線
\w —–匹配不是字母、數字、下劃線的字元
\s —–匹配空白字元
\s —–匹配不是空白的字元
\d —-匹配數字
\d —-匹配非數字的字元
\b —-匹配單詞的開始和結束
\b —-匹配不是單詞開始和結束
. —-匹配任意字元,包括漢字
如果要匹配**號碼,需要形如「\d\d\d\d-\d\d\d\d\d\d\d」這樣的正規表示式,其中出現了11次「\d」,表達方式繁瑣,正規表示式提供了對表示式的一部分進行重複處理的功能。
正規表示式中的常用限定符:
* —–匹配零次或多次
+ —–匹配一次或多次
? —–匹配一次或零次
—-重複m次
—重複m到n次,其中n可以省略
利用{}可以控制字元重複的次數,例如\d表示1~3位數字,前面提到的**號碼採用如下的正規表示式:
\d-\d|\d-\d
如果要對正規表示式進行巢狀,就需要使用分組「()」,例如,對3位數字重複3次,可以使用如下的正規表示式表示:
(\d
\d\d)
預設情況下,正規表示式將匹配最長的字串作為結果,可以通過在限定符後面新增「?」的方式,獲取最短的匹配結果,例如,對字元「a」到字元「c」之間的字元進行匹配。
2.使用re模組處理正規表示式
python的re模組具有正規表示式匹配的功能,re模組提供了一些根據正規表示式進行查詢、替換、分隔字串的函式,這些函式使用乙個正規表示式作為第乙個引數。
re模組的常用函式:
findall(pattern,string,flags=0):根據pattern在string中匹配字串。如果匹配成功,返回包含匹配結果的結果列表,否則,返回空列表。
sub(pattern,repl,string,count=0):根據指定的正規表示式,替換源字串中的 子串。pattern是乙個正規表示式,repl是用於替換的字串,string是源字串,如果count等於0,則返回string中匹配的所有結果,如果,count大於0,則返回前count個匹配結果。
match(pattern,string,flags=0):根據pattern從string的開頭匹配字串,只返回第一次匹配成功的物件,否則,返回none
search(pattern,string,flags=0):根據pattern從string中匹配字串,只返回第一次匹配成功的物件,否則,返回none
compile(pattern,flags=0)編譯正規表示式pattern,返回乙個pattern物件。
escape(pattern):匹配字串中的特殊字元,如*、+、?等
練習1:
import re
#^與$的使用
s = "hello world"
print(re.findall(r"^hello",s)) #預設區分大小寫的從字串開頭匹配以「hello」開始的字串
print(re.findall(r"hello",s,re.i)) #re.i為輔助引數,表示忽略大小寫,不區分大小寫的從字串開頭匹配以「hello」開始的字串
print(re.findall(r"world$",s)) #預設區分大小寫的從字串尾部匹配以「hello」開始的字串
print(re.findall(r"world$",s,re.i)) #不區分大小寫的從字串尾部匹配以「hello」開始的字串
print(re.findall(r"\b\w+\b",s)) #匹配每個英文單詞
s = "hello world"
print(re.sub("hello","hi",s))
print(re.sub("hello","hi",s[-4:])) #在切片是[-4:]範圍內替換「hello」,即在字串「orld」中替換「hello」
print(re.sub("world","china",s[-5:])) #在分片s[-5:]範圍內替換「world」,即把字串「world」替換為「china」
s = "你好 world2"
print("匹配字母數字:"+re.sub(r"\w","hi",s))
print("替換次數:"+str(re.subn(r"\w","hi",s)[1]))
print("匹配任意字元:"+re.sub(r".","hi",s))
print("替換次數:"+str(re.subn(r".","hi",s)[1]))
執行結果:
d
:\python36\python.exe e
:/demo_py/python/char_6/re_sign.py
['hello']
['world']
['hello', 'world']
hi world
orld
china
匹配字母數字:hihi hihihihihihi
替換次數:8
匹配任意字元:hihihihihihihihihi
替換次數:9
練習2:
import re
tel1 = "0791-1234567"
print(re.findall(r"\d-\d|\d-\d",tel1)) #匹配區號為3位的8位數**號碼或區號為4為的7位數**號碼,區號和**號碼之間用—連線
tel2 = "010-12345678"
print(re.findall(r"\d-\d|\d-\d",tel2))
tel3 = "(010)12345678"
print(re.findall(r"[\( ]?\d[\]-]?\d|[\( ]?\d[\]-]?\d",tel3)) #匹配區號為3位的8位數**號碼或區號為4為的7位數**號碼,區號和**號碼之間用—連線,或區號兩側加圓括號
執行結果:
d
:\python36\python.exe e
:/demo_py/python/char_6/re_number.py
['0791-1234567']
['010-12345678']
練習3:
import re
s = "1abc23def45"
p = re.compile(r"\d+") #返回乙個正規表示式物件p,匹配變數s中的數字
print(p.findall(s)) #呼叫p中的findall()方法,匹配的結果存放在列表中
print(p.pattern) #輸出當前使用的正規表示式
p = re.compile(r"(abc)\1") #定義乙個分組"(abc)",在後面使用「1」再次呼叫該分組,compile()返回乙個包含2個分組的正規表示式物件p
m = p.match("abcabcabc") #對字串進行搜尋,返回乙個match物件m
print(m.group(0)) #匹配0號組
print(m.group(1)) #匹配1號組
print(m.group()) #預設返回0號組
p = re.compile(r"(?p)abc(?p=one)") #給分組命名one表示分組的名稱,「(?p=one)呼叫分組one,相當於「\1」」
m = p.search("abcabcabc")
print(m.group("one"))
print(m.groupdict().keys()) #獲取正規表示式中分組的名稱
print(m.groupdict().values())#獲取正規表示式中分組的內容
print(m.re.pattern) #獲取當前使用的正規表示式
執行結果:
d
:\python36\python.exe e
:/demo_py/python/char_6/re.compiler.py
['1', '23', '45']
\d+abcabc
abcabcabc
dict_keys(['one'])
dict_values([''])
(?p)abc(?p=one)
Python 正規表示式(基礎)
正規表示式 regular expression 是乙個特殊的字串行,描述了一種字串匹配的模式可以用來檢查乙個串是否含有某種子串 將匹配的子串替換或者從某個串中取出符合某個條件的子串,或者是在指定的文章中,抓取特定的字串等。python處理正規表示式的模組是re模組,它是python語言擁有全部的正...
Python正規表示式基礎
直接給出字元就是精確匹配。特殊字元首先需要轉義如 d 匹配乙個數字,w 匹配乙個字母或者數字。123 d 可以匹配 1231 但是無法匹配 123a d d d 可以匹配到 123 w w w 可以匹配到 py3 表示任意乙個字元,py.可以表示py3 py 等 表示任意長個字元,表示至少乙個字元,...
Python基礎 正規表示式
re模組 正規表示式 元字元 不是普通的字元,是特殊字元!1 萬用字元 可以匹配除了換行符以外的任意乙個字元 例子 re.findall l.e abcloveabc 匹配字串中以l開頭以e結尾且長度為4的字串,若有多個則以列表的形式返回 2 以什麼開頭,只能從str開頭進行匹配 例子 re.fin...