python中正則表達式的一些問題
今天聽到一句話,覺得很在理——"當你遇到一個問題,想到用正則表達式解決時,就變成了兩個問題"
這也從側面說明了正則表達式比較難理解。下面我將用通俗易懂的方式總結一下,最近遇到的一些正則表達式的問題
一. 貪婪匹配的"毛病"
1. 太貪婪就"歇菜"了
匹配模式為r".*(\d*).*",在這個模式中,(\d*)表示貪婪匹配,匹配前面的字符\d,也就是數字0次或無數次,但是我們的字符串中,\d匹配無數次的情況是不存在的(實際上對於search方法,它會找到"1",如果"11"不滿足"1"匹配無數次,那麽它就會選擇匹配 "1" 0次,匹配0次後就直接返回了),因此,(\d*)表示的是匹配前面的數字0次,既然是0次,那麽返回的分組的內容應該是空字符串‘‘,group(1)和groups()都能驗證這一點,比如group(1)代表返回第1個分組的字符串,groups()返回一個包含所有小組字符串的元組,由於本例中只有一個分組,分組號為1,因此,我們可以看出得到的是空字符串‘‘
但是,有人又問了,為什麽.group()看到的是匹配整個字符串?事實上,我們的分組——匹配前面的數字0次——是不起任何作用的,就相當於匹配模式是r".*.*",不信請看下圖,結果是不是一模一樣?
舉個例子,匹配模式是很愛財的朋友,我的銀行余額是字符串,有一天他突然向我借錢,哥們,能不能借我很多錢?
我問,具體多少?他說,當然是越多越好啊,呵呵,這個貪心的人。我查詢賬戶余額,一瞅,只剩下10萬了,當然選擇不借給他!因此我知道他貪得無厭,我自己如果借給他10萬,他會問我要20萬,30萬...甚至更多,所以,對於利欲熏心的朋友,我是拒絕的——最後他一分錢也沒拿到,得到的是空(空字符串‘‘)。於是,這位朋友算是看了一眼我的賬戶余額(search()),灰溜溜的走了
2. "疑心重重"的貪婪
有一天,這個朋友又來了,這次他的疑心又加重了一些,他又向我借錢,哥們,能不能借我很多錢?
我掏出手機查了一下賬戶余額,上面寫著大約"10萬",這位朋友就是不死心,明明是不能滿足他的貪心,他還死纏著我不放,非要我查清楚具體的明細給他看,而且要精確到小數點之後的幾角幾分,第一次,我告訴他大約10萬,不能借給他,他拿到了空(空字符串‘‘),第二次,當我查詢具體明細時,上面顯示"101283.88"元,我再次拒絕了他,他又拿了一次空,這就是findall()的作用,返回所有能匹配到的子串
二. 貪婪的"頓悟"
1. "請把貪婪交給別人"
我的朋友在多次借錢無果的情況下,經過我苦口婆心的勸說,終於有點醒悟了,他打算洗心革面,做一個清心寡欲的人
有一天,他突然來找我,哥們,能不能借我點錢,兩位數的都成
我一聽,媽呀,這改變頗大,得了,借他99塊錢還是沒問題的,正要掏出99元時,他突然攔住我,表示要看我的賬戶余額
驚出一身冷汗,但還是抱著信任他的態度,把手機給他,他看了賬戶余額,"101283.88"元,緩緩地說道,你能借我8毛8嗎?
當然可以——我松了一口氣,有點懷疑的望著他,對了,你的貪婪哪裏去了?
他不假思索的說,我把貪婪給了別人——我們貪婪家族,輩分排在我前面的那個".*",有了他,我可以不背負貪婪的惡名,我只會找到最後面的兩位數,對你的余額來說,應該是最少的
2. 非貪婪——"大家都不貪了,才能實現互惠"
有一天,我的朋友開心的跑來找我,說他的前輩也洗心革面了,開始慢慢習慣清貧、習慣滿足
我知道,這是我朋友的功勞。當他得到欲望的危害後,他也向布道師一樣向前輩們傳遞這種思想
他的前輩就接收了他的洗禮,並且還刻意在帽子上畫了一個"?"的標記,那是他獨有的限制自我的符號
當然,這次朋友也是來向我借錢的,哥們,能不能給我借點錢,兩位數的都行,就像上次的語氣一樣
我這時卡裏還有"199.88"元,為什麽只剩下這麽點?是因為最近去炒股了
於是,我拿出99元,最大的兩位數給他,跟他說——快收下,這是你應得的
現在他也不仔細查看我的余額明細了,瞄了一眼大概的余額就收下了。的確,他在一天天進步...
python中正則表達式的一些問題