python中的正規表示式與unicode

2022-09-04 01:15:12 字數 1450 閱讀 8932

正規表示式作為一種最常用的工具,在平常的工作中使用的非常普遍,在python中是由re庫提供這個功能,除此之外還有regex庫提供額外的功能。

在一般的正規表示式介紹中都是以ascii為代表來介紹的,但是作為乙個中國的程式設計師,所遇到的乙個最基本的問題就是字元編碼了。所以這裡說下如何在python中匹配

非ascii字元。

正規表示式是使用乙個模式串來找出所有可以用模式串描述的字串,模式串由普通字元跟元字元組成,這就是正規表示式最核心的想法。在乙個模式串中,

普通字元是用於匹配,而元字元則可以看成是在普通字元上的施加的一種操作或者是函式。既然如此,非ascii字元對正規表示式的影響就集中在普通字元這一塊而不是

元字元。而普通字元是由整數值表示的,匹配則意味著在模式串中的整數值跟在目標串中的整數值相等,如果在目標串跟模式串中使用了不同的字元編碼,很明顯,他

們是不能匹配的。因此在使用正規表示式用於匹配非ascii字元時,需要保持模式串跟目標串的編碼一致。如下所示:

當模式串的字元編碼跟目標串一致的時候就能夠成功的匹配。如果你的模式串中只有普通字元,那麼這樣就可以滿足你的要求了。但是問題沒有這麼簡單,當你試圖用元字元的時候就會出現問題,示例如下:

這裡我們的模式串是'人生',想要匹配的字串是有乙個「人」和至少兩個「生」,但是從匹配的結果來看,這個正規表示式並沒有達到我們的目的。問題還是在於編碼,'人生'的gb18030編碼是'\xc8\xcb\xc9\xfa',因此這個正規表示式的意思就是匹配至少乙個'\xc8\xcb\xc9'和至少兩個'\xfa',和我們表達的意思完全按不同,原因在於乙個漢字字元使用了多個位元組的表示,而元字元+只作用在最後乙個位元組上。對於這種問題的解決方案也很簡單,就是尋找乙個能夠將漢字字元表示為數字的編碼,而不是使用多個數字來組合表示,也就是一種內部統一的表示。但是我現在又想到了乙個問題,任何乙個字元編碼最終都是乙個位元組乙個位元組的,因為計算機最基本的儲存單位就是位元組,所以這個問題在於字串比較函式的問題,沒有辦法將多個相關的位元組識別成乙個整體,才導致這個問題的。然後我們看到如果使用python內部的字元表示,那麼就沒有什麼問題!

在這裡使用unicode能夠解決問題,但是unicode帶來的編碼卻不止於此,因為如果把可以識別的字元從ascii擴大到unicode,那麼有些表示就需要重新定義了,比如\d,\w,\s等等。這裡就以\w為例來演示unicode的影響。

這裡(?u)就是啟用unicode dependent特性,可以看到在未啟用這個特性之前,使用正規表示式\w+不能匹配到任何的字串,但是使用這個特性,那麼就可以匹配到全部的漢字。其實在unicode中,每個字元除了對應乙個碼點(也就是乙個數字),還有對應的屬性,可以在正規表示式中使用屬性來進行匹配,比如屬性為漢字什麼的,還是很方便的。

正規表示式與python

在python中有乙個非常重要也非常好用的模組re,在import re後,就能夠在python中使用正規表示式,源於此次專案要用正規表示式對html 提取一定的字元,所以在這也就用些小例子來熟悉一下正規表示式 現在就用最簡單的例子 print re.findall r 執行後結果為 這個相對來說還...

python中的正規表示式

正規表示式是一種用來匹配字串的強有力的 它的設計思想是用一種描述性的語言來給字串定義乙個規則,凡是符合規則的字串,我們就認為它 匹配 了,否則,該字串就是不合法的。因為正規表示式也是用字串表示的,所以,我們要首先了解如何用字元來描述字元。在正規表示式中,如果直接給出字元,就是精確匹配。用 d可以匹配...

Python中的正規表示式

在使用python製作爬蟲之前,我們必須要對python的正規表示式有一定的了解,在python中使用正規表示式要匯入re包 d匹配數字1 9 w匹配字元 匹配集合裡面的字元 匹配前面出現的正規表示式1次或多次 表示匹配任意乙個字元,除換行符除外,x.匹配xy23中的xy,若是x.則匹配出xy2 表...