在編寫處理字符串的程序或網(wǎng)頁時(shí),經(jīng)常會(huì)有查找符合某些復(fù)雜規(guī)則的字符串的需要。正則表達(dá)式就是用于描述這些規(guī)則的工具望众。換句話說,正則表達(dá)式就是記錄文本規(guī)則的代碼。
很可能你使用過Windows/Dos下用于文件查找的通配符(wildcard)烂翰,也就是*和?夯缺。如果你想查找某個(gè)目錄下的所有的Word文檔的話,你會(huì)搜索*.doc甘耿。在這里踊兜,*會(huì)被解釋成任意的字符串。和通配符類似佳恬,正則表達(dá)式也是用來進(jìn)行文本匹配的工具捏境,只不過比起通配符,它能更精確地描述你的需求——當(dāng)然毁葱,代價(jià)就是更復(fù)雜——比如你可以編寫一個(gè)正則表達(dá)式垫言,用來查找所有以0開頭,后面跟著2-3個(gè)數(shù)字倾剿,然后是一個(gè)連字號(hào)“-”筷频,最后是7或8位數(shù)字的字符串(像010-12345678或0376-7654321)。
推薦學(xué)習(xí)30分鐘入門教程(ps:當(dāng)然你可能不止花費(fèi)30分鐘-):http://deerchao.net/tutorials/regex/regex.htm
Python堆正則表達(dá)式的支持:
compile
compile(pattern, flags=0)
編譯正則表達(dá)式返回正則表達(dá)式對(duì)象
match
match(pattern, string, flags=0)
用正則表達(dá)式匹配字符串前痘,匹配成功返回匹配對(duì)象凛捏,否則返回None。從第一個(gè)字符開始匹配芹缔。
search
search(pattern, string, flags=0)
搜索字符串中第一次出現(xiàn)正則表達(dá)式的模式坯癣,匹配成功返回匹配對(duì)象,否則返回None乖菱,可以從任意位置開始匹配坡锡。
findall 和 finditer
findall(pattern, string, flags=0)
查找字符串所有與正則表達(dá)式匹配的模式,并返回一個(gè)列表窒所。
finditer(pattern, string, flags=0)
查找字符串所有與正則表達(dá)式匹配的模式鹉勒,并且返回一個(gè)迭代器。span返回匹配的位置吵取,group返回匹配的內(nèi)容禽额。
下面這個(gè)實(shí)例是查找出字符串中所有的電話號(hào)碼,用findall 和 finditer 兩種方式查找
import re
def phone_num():
patter1 = re.compile(r'(?<=\D)1[345789]\d{9}(?=\D)')
sentence = '重要的事情說8130087690870遍,我的手機(jī)號(hào)是13567672929皮官,不是13789890976脯倒!'
# 找出所有匹配的內(nèi)容 返回一個(gè)列表
my_list = patter1.findall(sentence)
print(my_list)
# iter - iterator 迭代器
for temp in patter1.finditer(sentence):
print(temp)
print(temp.span())
print(temp.group())
if __name__ == '__main__':
phone_num()
sub
sub(pattern, repl, string, count=0, flags=0)
用指定的字符串替換原字符串中與正則表達(dá)式匹配的模式,
patter需要替換的字符捺氢,repl用作替換的內(nèi)容藻丢,string指定的字符串,count指定替換的次數(shù)摄乒,flags設(shè)置是否忽略大小寫悠反。
import re
def main():
sentence = '馬化騰傻逼操你大爺fuck你'
# 內(nèi)容替換
# 正則表達(dá)式 替換符 替換的內(nèi)容 是否忽略大小寫
pure = re.sub('[操草艸]|傻逼|fuck|馬化騰', '*', sentence, flags=re.IGNORECASE)
print(pure)
if __name__ == '__main__':
main()
注意:替換符可以是字符/字符串/可調(diào)用的函數(shù)残黑,下面這個(gè)例子的替換內(nèi)容就是一個(gè)函數(shù)。
from re import sub
def foo(mo):
# mo - 匹配對(duì)象
# group返回匹配的對(duì)象斋否,傳入?yún)?shù)foo1梨水,這是一個(gè)組名,返回此組的匹配的內(nèi)容
# mo.group('foo1') - 返回名稱為foo1組里的文本
value = int(mo.group('foo1'))
return str(value ** 2)
def main():
sentence = 'fgkfshf12hdjsh876hdf962hf'
# (?P<foo1>\d+) 匹配一個(gè)或多個(gè)數(shù)字茵臭,并捕獲文本到名稱為foo1的組里
# 注意:Python中必須加上P
print(sub(r'(?P<foo1>\d+)', foo, sentence))
if __name__ == '__main__':
main()
運(yùn)行結(jié)果:字符串中所有的數(shù)字都被替換成了其平方
fgkfshf144hdjsh767376hdf925444hf
split
split(pattern, string, maxsplit=0, flags=0)
patter拆分依據(jù)疫诽,string指定的字符串,flags設(shè)置是否忽略大小寫旦委。
def main():
sentence1 = 'you go your way, i will go home!'
# 按照空白符字符拆分
mylist = re.split(r'[ ,!]', sentence1)
print(mylist)
if __name__ == '__main__':
main()