第七章 模式匹配與正則表達(dá)式好像咕咕咕太久了,又滾來(lái)更新了。這次是第七章的內(nèi)容,正則表達(dá)式,如果寫的有問題,請(qǐng)給我留言,非常感謝。 在進(jìn)行本章內(nèi)容的筆記之前,先說(shuō)一下,正則表達(dá)式是什么。 百度給的定義如下:正則表達(dá)式是對(duì)字符串操作的一種邏輯共識(shí),就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來(lái)表達(dá)對(duì)字符串的一種過(guò)濾邏輯。(感覺其實(shí)說(shuō)的很清楚了,再簡(jiǎn)單一點(diǎn)就是說(shuō):類似一種速記的邏輯,用自己特定的方法表示信息) 不用正則表達(dá)式來(lái)查找文本模式首先,書上舉的例子,是在一些字符串中查找電話號(hào)碼。電話號(hào)碼的格式是xxx-xxx-xxxx。我先假定看到這篇讀書筆記的讀者們,都已經(jīng)了解了Python,或者有其他語(yǔ)言的基礎(chǔ),那么,先請(qǐng)大家思考一下,應(yīng)該怎么來(lái)實(shí)現(xiàn)呢? 最簡(jiǎn)單,完全不管包裝的方法就是直接從鍵盤或者文件輸入字符串,然后在“主函數(shù)”部分用if來(lái)進(jìn)行判斷。然后關(guān)于字符串、元組、列表部分如果到這里仍有疑問,就麻煩翻一下前面的內(nèi)容,在此不贅述啦。 以下是書中提供的代碼(我不記得我有沒有上傳過(guò)代碼包了,如果沒有我回頭上傳一下)
(輸出展示) 415-555-4242 is a phone number: True Moshi moshi is a phone number: False 幾點(diǎn)注釋: 1. isdecimal() 方法檢查字符串是否只包含十進(jìn)制字符。這種方法只存在于unicode對(duì)象。 注意:定義一個(gè)十進(jìn)制字符串,只需要在字符串前添加 'u' 前綴即可。 isdecimal()方法語(yǔ)法:
如果字符串是否只包含十進(jìn)制字符返回True,否則返回False。 2.調(diào)用函數(shù)的方法和其他語(yǔ)言差距不大 3.一定要注意空格,我太長(zhǎng)時(shí)間沒寫了,導(dǎo)致長(zhǎng)時(shí)間報(bào)錯(cuò)(我真應(yīng)該找到我的游標(biāo)卡尺,枯了) ' isPhoneNumber()函數(shù)的代碼進(jìn)行幾項(xiàng)檢查,看看text中的字符串是不是有效的電話號(hào)碼。如果其中任意一項(xiàng)檢查失敗,函數(shù)就返回False。代碼首先檢查該字符串是否剛好有12個(gè)字符?。然后它檢查區(qū)號(hào)(就是text中的前3個(gè)字符)是否只包含數(shù)字?。函數(shù)剩下的部分檢查該字符串是否符合電話號(hào)碼的模式:號(hào)碼必須在區(qū)號(hào)后出現(xiàn)第一個(gè)短橫線?, 3個(gè)數(shù)字?,然后是另一個(gè)短橫線?,最后是4個(gè)數(shù)字?如果程序執(zhí)行通過(guò)了所有的檢查,它就返回True?。 ' 然后,再利用前面提到的切片的方法,我們還可以從一串字符(不像前面的直接判斷一小段一小段的字符串是不是電話號(hào)碼)中提取電話號(hào)碼。代碼如下:
(輸出展示) Phone number found: 415-555-1011 “ 在for 循環(huán)的每次迭代中, 取自message 的一段新的 12個(gè)字符被賦給變量chunk?.例如,在第一次迭代, i是0, chunk被賦值為message[0:12] (即字符串'Call me at 4').在下次選代,i是1, chunk 被賦值為message[1:13] (字符串'all me at 4I')。 ” 用正則表達(dá)式查找文本模式我們還是回到上面的問題,電話號(hào)碼,因?yàn)闀厥敲绹?guó)人寫的,就按照他們的習(xí)慣,電話號(hào)碼格式是xxx-xxx-xxxx,那么正則表達(dá)式會(huì)長(zhǎng)什么樣子呢?就是用約定俗成的符號(hào)\d來(lái)代替我前面隨意用的x,\d\d\d-\d\d\d-\d\d\d\d,因?yàn)槿四厥翘貏e懶惰的,當(dāng)然也是為了盡量避免失誤,所以還有一個(gè)簡(jiǎn)化版本的:\d\d\d-\d\d\d-\d\d\d\d=》\d{3}-\d{3}-\d{4},通過(guò)花括號(hào)中間加數(shù)字表示前面的符號(hào)重復(fù)幾遍。 創(chuàng)建正則表達(dá)式對(duì)象 Python中所有的正則表達(dá)式都在re模塊中
如果不導(dǎo)入就會(huì)報(bào)錯(cuò):NameError:balabalabala…… 如果我們要?jiǎng)?chuàng)建一個(gè)Regex對(duì)象來(lái)匹配電話號(hào)碼模式(讓phoneNumRegex中包含一個(gè)Regex對(duì)象): phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') 匹配Regex對(duì)象 通過(guò)search()方法查找字符串 那么前面的def部分+切片查找部分就被search()替代了
(輸出展示) phone number found: 415-555-4242 幾點(diǎn)注釋: 1.search():http://www.cnblogs.com/aaronthon/p/9435967.html 2.group():https://www.cnblogs.com/erichuo/p/7909180.html 用正則表達(dá)式匹配更多模式可以使用括號(hào)分組(搭配group()使用) 比如上面提到的:\d\d\d-\d\d\d-\d\d\d\d=》(\d\d\d)-(\d\d\d-\d\d\d\d) 上面的代碼改成:
(輸出展示) 415 如果把注釋去掉,輸出如下: 415
(輸出展示) 415 括號(hào)在正則表達(dá)式中有特殊的含義,但是如果你需要在文本中匹配括號(hào),怎么辦?例如,你要匹配的電話號(hào)碼,可能將區(qū)號(hào)放在一對(duì)括號(hào)中。 在這種情況下,就需要用倒斜杠對(duì)(和)進(jìn)行字符轉(zhuǎn)義。
(輸出展示) (415) 用管道匹配多個(gè)分組 那么,“管道”是什么呢?在本書中,將字符‘|’稱為“管道”,用于希望匹配許多表達(dá)式中的一個(gè)時(shí)。比如:
(輸出展示) Batman 如果Batman 和Tina Fey都出現(xiàn)在字符串中,那么返回第一個(gè)出現(xiàn)的匹配文本。 (后面還會(huì)提到“findall()”方法,可以用來(lái)找到“所有”匹配的地方) 也可以使用管道來(lái)匹配多個(gè)模式中的一個(gè)。比如說(shuō),書上舉例子要匹配'Batman'、'Batmobile'、'Batcopter'、'Batbat'中任意一個(gè)。因?yàn)槎家浴瓸at’開頭?!噙€可以簡(jiǎn)化:
(輸出展示) Batmobile 方法調(diào)用mo.group()返回了完全匹配的文本‘Batmobile’,而mo.group(1)只是返回第一個(gè)括號(hào)分組內(nèi)匹配的文本‘mobile’。 如果需要匹配正真的管道字符,就用倒斜杠轉(zhuǎn)義->\(思考這個(gè)意思是:
) 用問號(hào)實(shí)現(xiàn)可選匹配 直接舉例子吧
在這里'(wo)?'就是一個(gè)可選擇的項(xiàng),就是類似可以省略可以不省略的意思。 如果真的需要匹配問號(hào)的,同上,還是加上倒斜杠轉(zhuǎn)義。 用星號(hào)匹配零次或多次
就和?差不了多少啦,無(wú)非就是把一次或零次改成零次或無(wú)數(shù)次(突然想起來(lái),據(jù)說(shuō)女裝只有零次和無(wú)數(shù)次~) 用加號(hào)匹配一次或多次 先看一個(gè)報(bào)錯(cuò)的:
看一下報(bào)錯(cuò)信息: Batwoman Process finished with exit code 1 然后是不報(bào)錯(cuò)的:
這個(gè)很容易理解的,因?yàn)榧犹?hào)要求至少有一個(gè)。 用花括號(hào)匹配待定次數(shù)
(輸出展示) HaHaHa (Ha){3,5}的意思呢,就是:((Ha)(Ha)(Ha)|(Ha)(Ha)(Ha)(Ha)|(Ha)(Ha)(Ha)(Ha)(Ha))醬紫 貪心和非貪心匹配說(shuō)到貪心,我又想起來(lái)我的那些看什么都是貪心的日子(DFS、BFS、線性規(guī)劃等等看什么都是貪心) ---------------------------------未完,找時(shí)間填坑------------------------------- 插一個(gè)閑篇啊,我一邊填坑,一邊等著老師講爬蟲,然后在這本書的后面也提到了一個(gè)Python自帶的模塊——webbrowser,作用非常無(wú)聊(不過(guò)給我提供了一個(gè)不用<a></a>就能打開網(wǎng)頁(yè)的方法)
參考: http://www.runoob.com/python/att-string-isdecimal.html |
|
來(lái)自: Four兄 > 《Python筆記》