一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python 正則表達(dá)式(轉(zhuǎn)義問(wèn)題)

Python 正則表達(dá)式(轉(zhuǎn)義問(wèn)題)

2020-05-17 11:10腳本之家 Python

這篇文章主要介紹了Python 正則表達(dá)式(轉(zhuǎn)義問(wèn)題),需要的朋友可以參考下

先說(shuō)一個(gè)比較囧的事情:在寫(xiě)蝦米音樂(lè)試聽(tīng)下載器的時(shí)候遇到一個(gè)問(wèn)題,因?yàn)楸4娴奈募际怯靡魳?lè)的標(biāo)題命名的,所以碰到一些諸如「対峙/out border」等含有非法字符(哼哼,說(shuō)的就是你 →_→ Windows)的標(biāo)題的時(shí)候,就會(huì)保存失敗。于是我想起了迅雷的解決方法:把所有的非法字符替換成下劃線。

于是就引入了正則表達(dá)式的使用。一番搜索囫圇吞棗后,我寫(xiě)下了這樣的函數(shù):

  1. def sanitize_filename(filename): 
  2. return re.sub('[/:*?<>|]''_', filename) 

最近意識(shí)到了這個(gè)函數(shù)里的好多問(wèn)題:

  • Python 和 Shell 不同,無(wú)論單引號(hào)還是雙引號(hào),反斜杠都是轉(zhuǎn)義符。走狗屎運(yùn)的是,Python 對(duì)于沒(méi)意義的轉(zhuǎn)義 / 的處理是保持原樣。
  • 即便如此,sanitize_filename('\/:*?<>|') 依舊返回 _______ 而不是全部都是下劃線。

于是感覺(jué)得正正經(jīng)經(jīng)看看文檔了。

Raw strings

看了文檔后才意識(shí)到,Python 正則表達(dá)式模塊的轉(zhuǎn)義是獨(dú)立的。例如匹配一個(gè)反斜杠字符需要將參數(shù)寫(xiě)成:'\\':

Python 將字符串轉(zhuǎn)義:\\ 被轉(zhuǎn)義為 \
re 模塊獲得傳入的 \ 將其解釋為正則表達(dá)式,按照正則表達(dá)式的轉(zhuǎn)義規(guī)則將其轉(zhuǎn)義為
如此麻煩的前提下,Raw String 就大有作為了,顧名思義就是(除了結(jié)尾的反斜杠)不會(huì)被轉(zhuǎn)義的字符串。于是匹配一個(gè)反斜杠字符就可以寫(xiě)作 r'\'。

所以上面的 sanitize_filename 改成了:

  1. def sanitize_filename(filename): 
  2. return re.sub(r'[\/:*?<>|]''_', filename) 

Regex 和 Match

于是正經(jīng)看看 re 模塊吧~以下為流水帳,供急性子觀看。

Python 的正則表達(dá)式模塊 re 中主要的對(duì)象其實(shí)是這倆:

正則表達(dá)式 RegexObject
匹配 MatchObject
RegexObject 是正則表達(dá)式對(duì)象,所有 match sub 之類的操作都?xì)w它所有。由 re.compile(pattern, flag) 生成。

  1. >>> email_pattern = re.compile(r'w+@w+.w+'
  2. >>> email_pattern.findall('My email is [email protected] and his is [email protected]'
  3. ['[email protected]''[email protected]'

其中的方法:

search 從任意字符開(kāi)始匹配,返回 MatchObject 或者 None
match 從第一個(gè)字符開(kāi)始匹配,返回 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á)式對(duì)象的捷徑。而由于 RegexObject 對(duì)象本身可以反復(fù)使用,這也是它相對(duì)于這些捷徑函數(shù)的優(yōu)勢(shì)所在。

MatchObject 則是匹配對(duì)象,表示一次正則表達(dá)式匹配的結(jié)果。由 RegexObject 的一些方法返回。匹配對(duì)象永遠(yuǎn)是 True 的,另外還有一大堆用來(lái)取得正則表達(dá)式中分組(group)相關(guān)信息的方法。

  1. >>> for m in re.finditer(r'(w+)@w+.w+''My email is [email protected] and his is [email protected]'): 
  2. ... print '%d-%d %s %s' % (m.start(0), m.end(0), m.group(1), m.group(0)) 
  3. ... 
  4. 12-23 abc [email protected] 
  5. 35-51 user [email protected] 
參考

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 外国a级片 | 波多野 在线 | 艹艹逼| 高级黄色片 | 俄罗斯引擎首页进入 | 新新电影理论中文字幕 | www.亚洲色图 | 国产清纯女高中生在线观看 | 国产成人综合精品一区 | 欧洲第一区第二区第三区 | 情欲综合网 | 秋葵视频成人 | 99国产高清久久久久久网站 | 亚洲久草在线 | 午夜剧场1000| 久青草国产97香蕉在线视频 | 国产在线精品一区二区高清不卡 | 国产目拍亚洲精品一区二区三区 | 欧美最猛性xxxxx男男 | 久久精品黄AA片一区二区三区 | 亚洲国产经典 | 欧美草逼网| 性生大片免费看 | 红色播放器 | 91免费在线 | 99久久999久久久综合精品涩 | 亚洲卡一卡2卡三卡4卡无卡三 | 2012手机在线中文字幕 | meyd–456佐山爱在线播放 | 国产精品视频免费视频 | 久久精品熟女亚洲AV国产 | 成年人在线视频免费观看 | 夫妻性生活影院 | 四虎影视在线永久免费观看 | 四虎影视在线看免费 720p | 亚洲人成综合在线播放 | 4444kk在线看片 | 国产精品国产高清国产专区 | 免费国产一级观看完整版 | 色网在线视频 | 色花堂国产精品首页第一页 |