Python Regex(轉義問題)

來源:互聯網
上載者:User
先說一個比較囧的事情:在寫蝦米音樂試聽下載器的時候遇到一個問題,因為儲存的檔案都是用音樂的標題命名的,所以碰到一些諸如「対峙/out border」等含有非法字元(哼哼,說的就是你 →_→ Windows)的標題的時候,就會儲存失敗。於是我想起了迅雷的解決方案:把所有的非法字元替換成底線。

於是就引入了Regex的使用。一番搜尋囫圇吞棗後,我寫下了這樣的函數:

複製代碼 代碼如下:


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

最近意識到了這個函數裡的好多問題:

  • Python 和 Shell 不同,無論單引號還是雙引號,反斜線都是轉義符。走狗屎運的是,Python 對於沒意義的轉義 \/ 的處理是保持原樣。
  • 即便如此,sanitize_filename('\\/:*?<>|') 依舊返回 \_______ 而不是全部都是底線。

於是感覺得正正經經看看文檔了。

Raw strings

看了文檔後才意識到,Python Regex模組的轉義是獨立的。例如匹配一個反斜線字元需要將參數寫成:'\\\\':

Python 將字串轉義:\\\\ 被轉義為 \\
re 模組獲得傳入的 \\ 將其解釋為Regex,按照Regex的轉義規則將其轉義為 \
如此麻煩的前提下,Raw String 就大有作為了,顧名思義就是(除了結尾的反斜線)不會被轉義的字串。於是匹配一個反斜線字元就可以寫作 r'\\'。

所以上面的 sanitize_filename 改成了:

複製代碼 代碼如下:


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

Regex 和 Match

於是正經看看 re 模組吧~以下為流水帳,供急性子觀看。

Python 的Regex模組 re 中主要的對象其實是這倆:

Regex RegexObject
匹配 MatchObject
RegexObject 是Regex對象,所有 match sub 之類的操作都歸它所有。由 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 返回 (替換後的字串, 替換次數)
re 模組裡提供的函數如 re.sub re.match re.findall 實際上都可以認為是一種省去直接建立Regex對象的捷徑。而由於 RegexObject 對象本身可以反覆使用,這也是它相對於這些捷徑函數的優勢所在。

MatchObject 則是匹配對象,表示一次Regex匹配的結果。由 RegexObject 的一些方法返回。匹配對象永遠是 True 的,另外還有一大堆用來取得Regex中分組(group)相關資訊的方法。

複製代碼 代碼如下:


>>> 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
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.