python与正则表达式(part2)--正则表达式的转义
文章目錄
- 正則表達式的轉義
正則表達式的轉義
- 如果使用正則表達式來匹配特殊字符(. * + ? ^ $ [] () {} | ),則需要在特殊符號前加上【\】 表示轉義。
例子1
In : re.findall('-?\d+\.?\d*',"123,-123,1.23,-1.23") Out: ['123', '-123', '1.23', '-1.23']例子2
In :print(re.findall('\$\d+',"薪資:$100")) Out: ['$100']- 在編程語言中,常使用原生字符串書寫正則表達式避免多重轉義的麻煩。
當我們使用re模塊進行匹配時,我們輸入一串python字符串,py先將python字符串解析為正則表達式,再利用正則表達式匹配目標字符串:
| \\$\\d+ --解析為-- > \$\d+ --匹配-- > $100 |
我們解釋一下上面的表格的含義:如果我們用正則表達式匹配$100,那么我們就要將正則表達式,以字符串的形式傳給findall()做參數,那么我們如何寫這個字符串來表達正則表達式呢?在字符串中我們遇到特殊字符(這里的特殊字符,是針對于python來說的特殊字符,比如【\】【\b】等等)也需要進行轉義,所以我們可以用\\$\\d+來表示正則表達式\$\d+。故,其實最正統的例子2中的寫法應該是:
In : print(re.findall('\\$\\d+',"薪資:$100")) Out: ['$100']那為啥例子2中的寫法也對了呢? 那是因為如果我們寫成【\\$\\d+】,python會先經過字符串的轉義解析,解析為【\$\d+】。而,我們例子2中的寫法【\$\d+】,結果python無法識別。比如,對于【\$】,由于python沒有這么一個特殊字符,py無法識別,所以py就給我們原樣解析了;同時,python也沒有【\d】這么一個特殊字符,所以,py也給我們原樣解析了;而【+】本身就是【+】。所以最后,我們寫成【\$\d+】也能匹配$100.
比如之前一個例子:
In : print(re.findall(r'\bis\b', "This is XiaoHuang")) Out: ['is'] #這里輸出的is,是第二個is(兩邊都有空格的is)若我們不在字符串前加【r】時,python會得到什么樣的結果呢?
In :print(re.findall('\bis\b', "This is XiaoHuang")) Out: []嗯!啥都沒有~
這是為啥呢?
那是因為在python字符串中,存在特殊字符【\b】,表示退格。則若輸入【\bis\b】,則python會解析為【退格is退格】,那么后面的字符串就不會被匹配。所以這里我們應該寫成【\\bis\\b】:
那么現在問題又來了! 如果我們現在想匹配【薪資:$100\200】中的【$100\200】,我們該怎么寫呢???
注意:當我們利用py進行匹配時,被匹配的【薪資:$100\200】也為python字符串,所以在python中應該寫為:【薪資:$100\\200】。
這時,我們的正則表達式應該寫成:【\$\d+\\\d+】,python字符串應該寫成:【\\$\\d+\\\\\\d+】:
匹配是匹配出來了,但是……WC, 這也太冗雜了。故我們引入了原生字符串。原生字符串是指,在字符串之前加一個【r】,使字符串內部所有可能會發生的轉義,都不發生轉義解析,即避免字符串內的所有轉義解析。比如,在字符串前加了【r】之后,【\】就表示單純的【\】,【\b】就表示單純的【\b】。我們在iPython內驗證一下:
In : r'\n' Out: '\\n'嗯!perfect!
因此,當我們用了原生字符串后,我們的正則表達式是什么樣的,python字符串內,就可以寫成什么樣~
所以,我們上面的那個例子就可以寫成:
備注:原生字符串不僅僅在正則表達式中有應用,只要我們想保持原樣的內容,不進行轉義,都可以使用原生字符串。
總結
以上是生活随笔為你收集整理的python与正则表达式(part2)--正则表达式的转义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 武汉装修公司10强排名,武汉装修公司哪家
- 下一篇: python与正则表达式(part3)-