Python 正則表達(dá)式(轉(zhuǎn)義問題)
先說一個比較囧的事情:在寫蝦米音樂試聽下載器的時候遇到一個問題,因?yàn)楸4娴奈募际怯靡魳返臉?biāo)題命名的,所以碰到一些諸如「対峙/out border」等含有非法字符(哼哼,說的就是你 →_→ Windows)的標(biāo)題的時候,就會保存失敗。于是我想起了迅雷的解決方法:把所有的非法字符替換成下劃線。
于是就引入了正則表達(dá)式的使用。一番搜索囫圇吞棗后,我寫下了這樣的函數(shù):
def sanitize_filename(filename):
return re.sub('[\/:*?<>|]', '_', filename)
最近意識到了這個函數(shù)里的好多問題:
- Python 和 Shell 不同,無論單引號還是雙引號,反斜杠都是轉(zhuǎn)義符。走狗屎運(yùn)的是,Python 對于沒意義的轉(zhuǎn)義
\/
的處理是保持原樣。 - 即便如此,
sanitize_filename('\\/:*?<>|')
依舊返回\_______
而不是全部都是下劃線。
于是感覺得正正經(jīng)經(jīng)看看文檔了。
Raw strings
看了文檔后才意識到,Python 正則表達(dá)式模塊的轉(zhuǎn)義是獨(dú)立的。例如匹配一個反斜杠字符需要將參數(shù)寫成:'\\\\':
Python 將字符串轉(zhuǎn)義:\\\\ 被轉(zhuǎn)義為 \\
re 模塊獲得傳入的 \\ 將其解釋為正則表達(dá)式,按照正則表達(dá)式的轉(zhuǎn)義規(guī)則將其轉(zhuǎn)義為 \
如此麻煩的前提下,Raw String 就大有作為了,顧名思義就是(除了結(jié)尾的反斜杠)不會被轉(zhuǎn)義的字符串。于是匹配一個反斜杠字符就可以寫作 r'\\'。
所以上面的 sanitize_filename 改成了:
def sanitize_filename(filename):
return re.sub(r'[\\/:*?<>|]', '_', filename)
Regex 和 Match
于是正經(jīng)看看 re 模塊吧~以下為流水帳,供急性子觀看。
Python 的正則表達(dá)式模塊 re 中主要的對象其實(shí)是這倆:
正則表達(dá)式 RegexObject
匹配 MatchObject
RegexObject 是正則表達(dá)式對象,所有 match sub 之類的操作都?xì)w它所有。由 re.compile(pattern, flag) 生成。
>>> email_pattern = re.compile(r'\w+@\w+\.\w+')
>>> email_pattern.findall('My email is abc@def.com and his is user@example.com')
['abc@def.com', 'user@example.com']
其中的方法:
search 從任意字符開始匹配,返回 MatchObject 或者 None
match 從第一個字符開始匹配,返回 MatchObject 或者 None
split 返回由匹配分割的 List
findall 返回所有匹配的 List
finditr 返回 MatchObject 的迭代器
sub 返回替換后的字符串
subn 返回 (替換后的字符串, 替換次數(shù))
re 模塊里提供的函數(shù)如 re.sub re.match re.findall 實(shí)際上都可以認(rèn)為是一種省去直接創(chuàng)建正則表達(dá)式對象的捷徑。而由于 RegexObject 對象本身可以反復(fù)使用,這也是它相對于這些捷徑函數(shù)的優(yōu)勢所在。
MatchObject 則是匹配對象,表示一次正則表達(dá)式匹配的結(jié)果。由 RegexObject 的一些方法返回。匹配對象永遠(yuǎn)是 True 的,另外還有一大堆用來取得正則表達(dá)式中分組(group)相關(guān)信息的方法。
>>> for m in re.finditer(r'(\w+)@\w+\.\w+', 'My email is abc@def.com and his is user@example.com'):
... print '%d-%d %s %s' % (m.start(0), m.end(0), m.group(1), m.group(0))
...
12-23 abc abc@def.com
35-51 user user@example.com
參考
- The Python Standard Library: http://docs.python.org/2/library/re.html
相關(guān)文章
詳解Python+Turtle繪制奧運(yùn)標(biāo)志的實(shí)現(xiàn)
turtle庫是Python標(biāo)準(zhǔn)庫之一,是入門級的圖形繪制函數(shù)庫。本文就將利用turtle庫繪制一個奧運(yùn)標(biāo)志—奧運(yùn)五環(huán),感興趣的可以學(xué)習(xí)一下2022-02-02python實(shí)現(xiàn)身份證實(shí)名認(rèn)證的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)身份證實(shí)名認(rèn)證的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11關(guān)于Python網(wǎng)絡(luò)爬蟲requests庫的介紹
這篇文章主要介紹了關(guān)于Python網(wǎng)絡(luò)爬蟲requests庫,而很多時候這些數(shù)據(jù)存儲在網(wǎng)頁中,手動下載需要花費(fèi)的時間太長,這時候我們就需要網(wǎng)絡(luò)爬蟲幫助我們自動爬取這些數(shù)據(jù),需要的朋友可以參考下2023-04-04使用python實(shí)現(xiàn)ftp的文件讀寫方法
今天小編就為大家分享一篇使用python實(shí)現(xiàn)ftp的文件讀寫方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07細(xì)數(shù)nn.BCELoss與nn.CrossEntropyLoss的區(qū)別
今天小編就為大家整理了一篇細(xì)數(shù)nn.BCELoss與nn.CrossEntropyLoss的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02從CentOS安裝完成到生成詞云python的實(shí)例
下面小編就為大家分享一篇從CentOS安裝完成到生成詞云python的實(shí)例,具有很好的參考價值,希望對大家有所幫助2017-12-12