摘要:今天就專門看看正則表達(dá)式。下面是一個(gè)正則表達(dá)式最簡(jiǎn)單的使用例子。這個(gè)例子使用了正則表達(dá)式模塊的函數(shù),它會(huì)返回所有符合模式的列表。查詢標(biāo)志讓正則表達(dá)式具有不同的行為。,按給定正則表達(dá)式分割字符串。,正則表達(dá)式中捕獲組的數(shù)量。
最近研究Python爬蟲,很多地方用到了正則表達(dá)式,但是沒好好研究,每次都得現(xiàn)查文檔。今天就專門看看Python正則表達(dá)式。本文參考了官方文檔 re模塊。
模式首先正則表達(dá)式的語法我就不說了,這玩意倒是不算難,用的時(shí)候現(xiàn)查就行了——正則表達(dá)式_百度百科。
在很多編程語言中,由于有轉(zhuǎn)義字符這么一種東西的存在,導(dǎo)致正則表達(dá)式需要使用兩個(gè)斜杠來處理。如果編程語言支持原始字符串,那么就不需要兩個(gè)斜杠了。在Python中,字符串前面添加字母r即可把字符串變成原始字符串。
下面是一個(gè)正則表達(dá)式最簡(jiǎn)單的使用例子。我們查找所有以字母F開頭的單詞,不論大小寫。這個(gè)例子使用了正則表達(dá)式模塊的re.findall函數(shù),它會(huì)返回所有符合模式的列表。
import re text = "fuck shit it make she forest" results = re.findall(r"[Ff]w+", text) print(results)
如果某一個(gè)模式需要經(jīng)常使用,我們可以把它編譯為模式對(duì)象。然后從模式對(duì)象上調(diào)用各種正則查詢方法。這樣做的優(yōu)點(diǎn)是:由于模式已經(jīng)編譯了,所以后續(xù)的查詢速度會(huì)更快。
pattern = re.compile(r"[Ff]w+") print(pattern.findall(text))查詢標(biāo)志
大部分查詢方法還可以接受一個(gè)查詢標(biāo)志參數(shù)。查詢標(biāo)志讓正則表達(dá)式具有不同的行為。下面一一說明。
標(biāo)志 | 作用 |
---|---|
re.A、re.ASCII | 以ASCII模式查詢,默認(rèn)是Unicode模式 |
re.DEBUG | 顯示編譯表達(dá)式的調(diào)試信息 |
re.I、re.IGNORECASE | 忽略字母的大小寫 |
re.L、re.LOCALE | 以區(qū)域敏感方式查詢匹配 |
re.M、re.MULTILINE | 開啟多行模式,開啟之后行邊界符^$會(huì)匹配每行的開始和結(jié)束,而不是整個(gè)字符串的開始和結(jié)束 |
re.S、re.DOTALL | 使用此標(biāo)志,會(huì)讓點(diǎn)符號(hào)匹配所有字符,默認(rèn)情況下點(diǎn)符號(hào)會(huì)匹配換行符以外的符號(hào) |
re.X、re.VERBOSE | 開啟啰嗦模式,可以在寫正則表達(dá)式的時(shí)候添加注釋 |
下面是啰嗦模式的例子,來自Python官方文檔。
a = re.compile(r"""d + # the integral part . # the decimal point d * # some fractional digits""", re.X) b = re.compile(r"d+.d*")查詢方法
查詢方法有兩種形式,第一種是re模塊的函數(shù),這些函數(shù)需要接受一個(gè)模式字符串。第二種就是從編譯好的模式對(duì)象上調(diào)用,這樣不需要模式字符串了。基本上大部分方法都有這兩種形式,所以這里只需要介紹一種形式。
re.search(pattern, string, flags=0)方法查詢字符串,返回第一個(gè)結(jié)果的匹配對(duì)象。不管有多少個(gè)滿足條件的字符串,這個(gè)方法之返回第一個(gè)。如果查詢不到,就返回None。
re.match(pattern, string, flags=0)查詢字符串,當(dāng)字符串的前面一部分和模式匹配的時(shí)候,會(huì)返回相應(yīng)的匹配對(duì)象。如果不匹配,那么返回None。需要注意即使開啟了多行模式,這個(gè)方法也只查詢字符串最前面的一部分,不會(huì)查詢每行的前面。
re.fullmatch(pattern, string, flags=0),如果整個(gè)字符串和模式匹配,返回相應(yīng)的匹配對(duì)象。否則返回None。
re.split(pattern, string, maxsplit=0, flags=0),按給定正則表達(dá)式分割字符串。
re.findall(pattern, string, flags=0),最常用的方法,返回一個(gè)列表,包含所有匹配模式的字符串。
re.finditer(pattern, string, flags=0),和findall方法類似,不過返回的是一個(gè)迭代器。
re.sub(pattern, repl, string, count=0, flags=0),將字符串中匹配模式的部分使用repl替換,返回替換后的字符串。
re.subn(pattern, repl, string, count=0, flags=0),和sub方法類似,不過返回元組(新字符串,替換的數(shù)量)。
re.purge(),清除正則表達(dá)式緩存。
在已編譯好的正則表達(dá)式對(duì)象上還有以下幾個(gè)屬性。
flags,正則表達(dá)式的所有標(biāo)志,包括flags參數(shù)設(shè)置的,compile方法編譯傳入的,以及正則表達(dá)式中本身的標(biāo)志。
groups,正則表達(dá)式中捕獲組的數(shù)量。
pattern,返回模式字符串。
groupindex,返回(?P
上面提到的很多方法都返回匹配對(duì)象。匹配對(duì)象包含了一些方法和屬性,方便我們進(jìn)行查詢。
最常用的就是group函數(shù),它會(huì)返回指定組對(duì)應(yīng)的字符串。下面的例子就查詢了給定數(shù)據(jù)中的數(shù)據(jù)量和每頁的條數(shù)。第0組返回整個(gè)匹配,第1組返回第一個(gè)匹配,以此類推……也可以采用命名組的方式。
text = "總共20條數(shù)據(jù) 每頁5條" pattern = re.compile(r"總共(?Pd+)條數(shù)據(jù)s+每頁(?P d+)條") match = pattern.match(text) print(match.group(0))
另一個(gè)比較常用的函數(shù)就是groups(default=None),它返回所有組組成的元組。如果有的組沒有匹配到字符串,就會(huì)顯示為None,這時(shí)候可以使用default參數(shù)指定默認(rèn)值。
text = "總共20條數(shù)據(jù) 每頁5條" pattern = re.compile(r"總共(?Pd+)條數(shù)據(jù)s+每頁(?P d+)條") match = pattern.match(text) print(match.groups()) # 結(jié)果 # ("20", "5")
groupdict(default=None)返回組名和字符串組成的字典。還是上面的例子。
print(match.groupdict()) # {"total": "20", "per": "5"}
start和end函數(shù)返回給定組的在字符串的起始和結(jié)束索引,如果對(duì)應(yīng)的組沒有任何匹配,則返回-1。下面的例子來自Python官方文檔,從電子郵件地址中去除remove_this。
>>> email = "tony@tiremove_thisger.net" >>> m = re.search("remove_this", email) >>> email[:m.start()] + email[m.end():] "tony@tiger.net"
match.span([group])返回給定組的起始索引和結(jié)束索引組成的元組。
以上就是Python正則表達(dá)式的大部分內(nèi)容了,靈活使用這些知識(shí),可以獲得強(qiáng)大的功能。關(guān)于如何巧用,就看大家的智慧了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/38581.html
摘要:正則表達(dá)式關(guān)閉或可選標(biāo)志。如果所含正則表達(dá)式,以表示,在當(dāng)前位置成功匹配時(shí)成功,否則失敗。否則指的是八進(jìn)制字符碼的表達(dá)式。 正則表達(dá)式是個(gè)很牛逼的東西,不管是在javascript,還是在Python web開發(fā)(http://www.maiziedu.com/course/python-px...)中,我們都會(huì)遇到正則表達(dá)式,雖然javascript和Python的正則表達(dá)式區(qū)別不大...
摘要:正則表達(dá)式是一種用來匹配字符串的強(qiáng)有力的武器。正則表達(dá)式匹配如果直接給出字符,就是精確匹配。模塊提供模塊,包含所有正則表達(dá)式的功能。分組除了簡(jiǎn)單地判斷是否匹配之外,正則表達(dá)式還有提取子串的強(qiáng)大功能。 正則表達(dá)式是一種用來匹配字符串的強(qiáng)有力的武器。它的設(shè)計(jì)思想是用一種描述性的語言來給字符串定義一個(gè)規(guī)則,凡是符合規(guī)則的字符串,我們就認(rèn)為它匹配了,否則,該字符串就是不合法的。 showImg...
摘要:反斜杠的困擾與大多數(shù)編程語言相同,正則表達(dá)式里使用作為轉(zhuǎn)義字符,這就可能造成反斜杠困擾。文本中正則表達(dá)式結(jié)束搜索的索引。以元組形式返回全部分組截獲的字符串。用于指定最大分割次數(shù),不指定將全部分割。 1. 正則表達(dá)式基礎(chǔ) 1.1. 簡(jiǎn)單介紹 正則表達(dá)式并不是Python的一部分。正則表達(dá)式是用于處理字符串的強(qiáng)大工具,擁有自己獨(dú)特的語法以及一個(gè)獨(dú)立的處理引擎,效率上可能不如str自帶的方法...
摘要:今天來給大家分享一份關(guān)于比較詳細(xì)的正則表達(dá)式寶典,學(xué)會(huì)之后你將對(duì)正則表達(dá)式達(dá)到精通的狀態(tài)。正則表達(dá)式是用在方法當(dāng)中,大多數(shù)的字符串檢索都可以通過來完成。導(dǎo)入模塊在使用正則表達(dá)式之前,需要導(dǎo)入模塊。 ...
摘要:正則表達(dá)式語法字符與字符類特殊字符以上特殊字符要想使用字面值,必須使用進(jìn)行轉(zhuǎn)義字符類包含在中的一個(gè)或者多個(gè)字符被稱為字符類,字符類在匹配時(shí)如果沒有指定量詞則只會(huì)匹配其中的一個(gè)。 1. 正則表達(dá)式語法 1.1 字符與字符類 1 特殊字符:.^$?+*{}| 以上特殊字符要想使用字面值,必須使用進(jìn)行轉(zhuǎn)義 2 字符類 1. 包含在[]中的一個(gè)或者多個(gè)字符被稱為字符類,字符類在匹配時(shí)如果沒有指...
閱讀 3077·2019-08-30 15:56
閱讀 1234·2019-08-29 15:20
閱讀 1571·2019-08-29 13:19
閱讀 1473·2019-08-29 13:10
閱讀 3381·2019-08-26 18:27
閱讀 3069·2019-08-26 11:46
閱讀 2234·2019-08-26 11:45
閱讀 3753·2019-08-26 10:12