您好,登錄后才能下訂單哦!
這篇文章主要講解了“python正則表達式舉例分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“python正則表達式舉例分析”吧!
請嘗試計算字符串四則運算式。注意代碼內可使用2個數的±*/,但不能用python的表達式功能運算表達式,也不能用eval函數運算。字符串四則運算式示例如下:
compute = '10-3*(20-10+(-10/5)*27/3/3-(-100)/(10-3*5))+(-2.5*-12)'
匹配數字(含正整數、負整數、正浮點數、負浮點數):
-?\d+(\.\d+)?
可以測試匹配123、-123、1.23、-1.23均成功。
表達式解析:
-?表示匹配-,?表示0個或1個。
\d+表示匹配數字,+表示1個或多個。
(\.\d+)?這部分最復雜,一步步來解釋。括號內是\.表示匹配小數點(若不加\則會匹配為除換行符外任意字符);\d+同上;一對圓括號后面跟?表示這些內容可能不出現或出現1次,意思是可以匹配小數點及后面1個或多個數字也匹配無小數點及后面的數字。
上述正則表達式經站長工具網站測試沒有問題,但是在python中代碼中會有問題,請看下面的代碼示例:
num1 = 'The number is 123 ?'num2 = 'The number is -123 ?'num3 = 'The number is 1.23 ?'num4 = 'The number is -123 ?'dig1 = re.compile('-?\d+(\.\d+)?')dig2 = re.compile('-?\d+(?:\.\d+)?')print(dig1.findall(num1))print(dig1.findall(num2))print(dig1.findall(num3))print(dig1.findall(num4))print(dig2.findall(num1))print(dig2.findall(num2))print(dig2.findall(num3))print(dig2.findall(num4))out:['']['']['.23']['']['123']['-123']['1.23']['-123']
認真閱讀代碼,可以看到findall函數使用dig1正則表達式字符串提取不到數字,而dig1正則表達式明明已經驗證過是正確的,為什么會提取不到數字呢?
這其中的原因是因為分組概念沖突!正則表達式的分組使用圓括號表示,而re模塊的分組也使用圓括號表示,請認真理解這2種分組概念是不同的之處,非常重要!!!
正則表達式的分組是把某一段表達式進行整體包裝,然后可對該整體做操作,如或|和范圍.?*{m,n}。
re模塊的分組是指對正則表達式匹配的內容再次篩選,只需要分組內匹配的部分內容。
解決方法是對正則表達式的分組左括號后面加?:實施分組隱藏,告訴python解釋器這個分組不是使用再次篩選的意思。
接下來嘗試匹配四則運算字符串中內層括號之中的內容:
compute = '10-3*(20-10+(-10/5)*27/3/3-(-100)/(10-3*5))+(-5*-6)'
匹配最內層括號:
\([\d.*/±]+?\)
在站長工具網站測試可以成功匹配出以下內容:
(-10/5)、(-100)、(10-3*5)、(-5*-6)
表達式解析:
先匹配外面的圓括號,注意都要用\轉義,然后觀察目標字符串的規律填寫括號中的內容。
括號中可以有的字符集是數字、小數點、加、減、乘、除,可以出現1次或多次,注意必須加在量詞+后面寫?標識為最短匹配。
再到python中測試正則表達式。
compute = '10-3*(20-10+(-10/5)*27/3/3-(-100)/(10-3*5))+(-5*-6)'result = re.findall('\([\d\.*/+-]+?\)', compute)print(result)out:['(-10/5)', '(-100)', '(10-3*5)', '(-5*-6)']
寫代碼以前我以為頂多半個小時搞定,結果被打臉了。寫代碼用了不到半個小時,調試用了一個多小時!前后2個小時才搞定。真的是看著容易做起來難!建議學python的朋友嘗試做一下這個練習。做這個練習對于掌握正則表達式和鍛煉編程能力很有幫助。
編程思路、代碼、調試過程我決定過幾天再公布。今天先貼一張運算結果的圖。
感謝各位的閱讀,以上就是“python正則表達式舉例分析”的內容了,經過本文的學習后,相信大家對python正則表達式舉例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。