文章目錄
- 正則運算式
- 概念
- 構成
- re模塊應用
- 常用正則運算式
- 數字
- 字符
- 其他
- 小結

正則運算式
概念
正則運算式作為計算機科學的一個概念,通常被用來檢索、替換那些符合某個規則的文本,正則運算式是對字串操作的一種邏輯公式,用事先定義好的規則字串對字串進行過濾邏輯處理,
正則運算式從本質上講,是一種小型的、高度專業化的編程語言,在Python中,正則運算式通過re模塊實作,正則運算式可以先給匹配的相應字串集指定規則,再通過re模塊一某些方式來修改或分隔字串,
正則運算式模式先被編譯成一系列的位元組碼,再由用C語言撰寫的匹配引擎執行,所以從某種程度上說比直接寫Python字串處理代碼快,但是并非所有字串匹配都能用正則運算式完成,即使可以處理單運算式也變得很復雜,可讀性差,這是建議直接撰寫Python代碼,
構成
正則運算式由2種字符構成,一種是在正則運算式中具有特殊意義的元字符,另一種是普
通字符,
字符及語法:
| 語法 | 說明 | 運算式示例 | 匹配舉例 |
|---|---|---|---|
| 普通字符 | 匹配本身 | Abc | abc |
| . | 匹配除了換行符\n外任意字符 | a.c | abc |
| \ | 轉義符 | a\.c | a.c |
| [abcd] | 匹配a或b或c或d | [abc] | a |
| [0-9] | 匹配0~9任一數字,相當于[0123456789] | [0-3] | 1 |
| [\u4e00-\u9fa5] | 匹配任一漢字 | [\u4e00-\u9fa5] | 漢 |
| [^a0=] | 匹配除了a、0、=外任意字符 | [^abc] | d |
| [^a-z] | 匹配除了小寫字符外任意字符 | [^a-z] | A |
| \d | 匹配任意一個數字,相當于[0-9] | a\dc | a6c |
| \D | 匹配任意一個非數字字符,相當于[^0-9] | a\Dc | abc |
| \s | 匹配任意空白字符,相當于[\r\n\f\t\v] | a\sc | a c |
| \S | 匹配任意非空白字符,相當于[^\r\n\f\t\v] | a\Sc | aYc |
| \w | 匹配任意一個字母、數字或下劃線,相當于[a-zA-Z0-9_] | a\wc | a_c |
| \W | 匹配任意一個非字母、數字或下劃線,相當于[^a-zA-Z0-9_] | a\wc | a*c |
| * | 匹配前一個字符0次或無限次 | a*c | c |
| + | 匹配前一個字符1次或無限次 | a+c | aaaac |
| ? | 匹配前一個字符0次或1次 | a?c | ac |
| {m} | 匹配前一個字符m次 | a{3}c | aaac |
| {m,n} | 匹配前一個字符m到n次,mn可以省略,mn默認值分別是0次和無限次 | a{1,2}c | aac |
| ^ | 匹配字串的開始位置,不匹配任何字符 | ^abc | abc |
| $ | 匹配字串的結束位置,不匹配任何字符 | abc$ | abc |
| | | 子運算式或關系匹配 | abc|def | def |
| (…) | 匹配分組 | (abc){2} | abcabc |
| (?P<name>…) | 匹配分組,除了原有編號外再指定一個額外的別名 | (?P<id>abc){2} | abcabc |
| \<number> | 匹配參考編號為<number>的分組到字串中 | (\d)abc\1 | 1abc1 |
| (?..) | 匹配不分組的(…),后接數量詞 | (?:abc){2} | abcabc |
| (?iLmsux) | iLmsux的每一個字符代表一個匹配模式,只能用于字串的開始位置,可選多個 | (?i)abc | AbC |
| (?#…) | #后的內容將被注釋忽略掉 | a(?#test)bc | abc |
| (?(id/name)yes-pattern|no-pattern) | 匹配編號為id或別名為name的組需要匹配yes-pattern,否則需要匹配no-pattern,類似三目運算子 | (\d)abc(?(1)\d|abc) | 1abc2 |
以上規則只是單一針對字串匹配,在實際應用中多會是多種單一匹配的組合,因此最好掌握以便Python開始時熟練應用,而直接記憶這些規則教枯燥,下文講結合Python的re模塊進行講解,以便熟練掌握,
re模塊應用
一、查看版本
Python從1.5版本后增加了re模塊,提供了入Perl風格的正則運算式模式,
re模塊內嵌在Python中,因此可以直接匯入,使用方法__version__可查看版本,以及方法__all__查看屬性方法:
import re
print(re.__version__)
print(re.__all__)
#輸出結果如下:
2.2.1
['match', 'fullmatch', 'search', 'sub', 'subn', 'split', 'findall', 'finditer', 'compile', 'purge', 'template', 'escape', 'error', 'Pattern', 'Match', 'A', 'I', 'L', 'M', 'S', 'X', 'U', 'ASCII', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL', 'VERBOSE', 'UNICODE']
上述代碼看出,re模塊涉及函式并不多,功能一是查找文本中的模式,二是編譯運算式,三是多層匹配,同時還定義了一些常量,
二、search()查找
查找文本中的模式主要使用search()函式,該函式有pattern、string、flags三個引數;
- pattern表示編譯時用的運算式字串
- string表示用于匹配的字串
- flags表示編譯標志為,用于修改正則運算式的匹配方式,如是否區分大小寫、多行匹配等,默認值為0,
常用的flag值如下:
| 標志 | 含義 |
|---|---|
| re.S(DOTALL) | 使“.”匹配包括換行在內的所有字符 |
| re.I(IGNORECASE) | 使匹配對大小寫不敏感 |
| re.L(LOCALE) | 做本地化識別匹配等 |
| re.M(MULTILINE) | 多行匹配,影響^和$ |
| re.X(VERBOSE) | 通過更靈活的格式以便正則運算式易于理解 |
| re.U | 根據Unicode字符集決議字符,影響\w、\W、\b、\B |
re.serach()函式通過模式和掃描的文本作為輸入,回傳匹配物件,若未找到匹配模式,則回傳None:

從上看出match為回傳的匹配物件,包含了有關匹配性質的資訊,使用正則運算式時,模式在原字串中出現的位置,具有start()、end()、group()、span()、groups()等方法:
start()回傳匹配開始位置end()回傳匹配結束位置group()回傳被匹配的字串span()回傳一個包含匹配(開始、結束)位置的元組groups()回傳一個包含正則運算式中所有小組字串的元組,從1到所含的小組號,通常不需要引數,除此之外,還有一個group(n,m)方法,回傳組號為(n,m)所匹配的字串,

三、compile()預編譯
使用函式compile()將正則運算式編譯成正則運算式物件,提高執行效率,該函式回傳的是一個物件模式,有pattern、flags=0兩個引數,含義和上文search()中提到一致,

通常編譯的運算式都是程式頻繁使用的運算式,這樣編譯起來會更加高效,但也會開銷一定快取,使用已編譯的運算式還有一個好處,即在加載模塊是就編譯所有運算式,而不是當程式回應用戶動作時才進行編譯,
四、match()開始位置匹配
使用函式match()在文本字串的開始位置匹配,這種方法并非完全匹配,只匹配字串的開始位置/首部,無須在乎其后是否還有字串,盡管后面可能匹配上,也全部忽略,

五、findall()及finditer()遍歷匹配
使用函式findall()進行遍歷匹配,獲取字串中所有匹配的字串,回傳一個串列,該函式的作用與引數跟search()函式一樣,但它回傳所有匹配且不重疊的子字串,
函式finditer()的使用方式和findall()一樣,只不過回傳的是一個迭代器,而不是串列,它將生成Match實體,

(
插播反爬資訊)博主CSDN地址:https://wzlodq.blog.csdn.net/
六、split()分割
函式split()能夠俺在匹配的子字串將需匹配的字串進行分割,并回傳一個串列,

七、sub()及subn()替換
函式sub使用pattern替換string中每一個匹配的子串,并回傳替換后的子串,格式為re.sub(pattern,repl,string,count,flag),而函式subn()在此基礎上多回傳一個替換次數,
- pattern是運算式字串
- repel是替換后的字符
- string是用于匹配的字串
- count是最大替換次數,超出后不再替換
- flag同上文

常用正則運算式
數字
數字運算式校驗主要針對文本中出現的數字進行正則運算式校的匹配,下面將講解一些常用的運算式,并使用re模塊對其進行處理演示,
-
^[0-9]*$
和前文提到的^是匹配字串開始位置;$是匹配字符的結束位置;[0-9]表示任一數字;*匹配前一個字符0次或無數次,下面的將不再贅述,不清楚請翻閱上文,
綜上,該運算式用來匹配數字,

-
^[1-9]\d*$匹配非0正整數

-
^\d{n}$匹配n位數字

-
^\d{n,}$匹配的是至少n位數字

-
^\d{m,n}$匹配m位到n位的數字

-
^[1-9][0-9]*.[0-9]{1,2}?$匹配非0開頭的最多帶兩位小數的數字

字符
文本分析中,常常會涉及字符運算式的處理,比如提取漢字,對長度為多少的字符進行洗掉等,
-
[\u4e00-\u9fa5]漢字匹配

-
^[A-Za-z0-9]+$英文和數字的匹配

-
^[\u4E00-\u9FA5AA-Za-z0-9]+$中英文數字匹配

其他
-
^\w+(-+.\w)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$E-mail地址校驗

-
^1[34589]\\d{9}$手機號碼

-
^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$身份證號

-
^[1-9]\d{5}(?!\d)$郵政編碼

-
(?i)^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$域名

小結
正則運算式re模塊最重要的功能就是過濾,從目標中過濾出所需的資料,然后再通過函陣列合等,從字串中過濾出任何特征的資料,是后續Python爬蟲決議資料的基礎,
Python系列博客持續更新中
原創不易,請勿轉載(
本不富裕的訪問量雪上加霜)
博主首頁:https://wzlodq.blog.csdn.net/
微信公眾號:唔仄lo咚鏘
如果文章對你有幫助,記得一鍵三連?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/265840.html
標籤:AI
下一篇:PyTorch 卷積神經網路簡介
