Python入門進階教程-正則表達式

「關注我,和我一塊兒放下靈魂,讓靈魂去搬磚。」git

Python正則表達式

Python版本3.8.0,開發工具:Pycharm正則表達式

Python正則表達式

正則表達式(英語:Regular Expression,在代碼中常簡寫爲 regex、regexp 或 RE)正則表達式一般被用來檢索、替換那些符合某個模式的文本編程

將Regular Expression(正則表達式)理解成規則表達式更好, 一個規則表達式(Regular Expression)一般被稱爲一個規則(Pattern),即咱們須要找到與規則一致的文本。api

總結bash

正則表達式(Regular Expressions,一般縮寫爲 Regex)是最強大且不可或缺的文本處理工具 —— 它的用處就是在文本中掃描/搜索與某一規則匹配的全部實例,而且還能夠按照規則捕獲其中的部分或者所有,對它們進行替換。微信


正則表達式介紹

在正則表達式中,存在操做符和操做元,操做符存在優先級,操做元被稱作原子多線程

  • 操做符優先級(由高到低)

(先不用在乎操做符的名稱,雖然也看不太懂)函數

1. 轉義符號 (Escaping Symbol):
    \
2. 分組、捕獲 (Grouping or Capturing):
    (...) (?:...) (?=...) (?!...) (?<=...) (?<!...)
3. 數量 (Quantifiers)
    a* a+ a? a{n, m}
4. 序列與定位(Sequence and Anchor)
    abc ^ $ \b \B
5. 或(Alternation)
    a|b|c
6. 原子 (Atoms)
    a [^abc] \t \r \n \d \D \s \S \w \W .

複製代碼

1. 本義字符工具

表明的就是它們的字面值,包括從 a 到 z,A 到 Z,0 到 9,還有 _post

注: 非本義字符:\ + * . ? - ^ $ | ( ) [ ] { } < >,建議都直接加上轉義符號 \ 來表示

2. 集合原子

標示集合原子,使用方括號 []。

即[abc] 的意思是說,「a or b or c」,即,abc 中的任意一個字符。

  • 在方括號中,咱們能夠使用兩個操做符:-(區間)和 ^(非)
- [a-z] 表示從小寫字母 a 到小寫字母 z 中的任意一個字符。
- [^abc] 表示 abc 之外的其它任意字符,即,非 [abc]。

舉:beg[iau]n 可以表明 begin、began,以及 begun。
複製代碼

注:一個集合原子中,^ 符號只能用一次,只能緊跟在 [ 以後。不然不起做用。

3. 類別原子

可以表明 「一類字符」 的原子,它們都得使用轉義符號再加上另一個符號表達

\d 任意數字;等價於 [0-9]
\D 任意非數字;等價於 [^0-9]
\w 任意本義字符;等價於 [a-zA-Z0-9_]
\W 任意非本義字符;等價於 [^a-zA-Z0-9_]
\s 任意空白;至關於 [ \f\n\r\t\v](注意,方括號內第一個字符是空格符號)
\S 任意非空白;至關於 [^ \f\n\r\t\v](注意,緊隨 ^ 以後的是一個空格符號)
.  除 \r \n 以外的任意字符;至關於 [^\r\n]
複製代碼

小技巧:d 是 digits;w 是 word characters;s 是 spaces

# 舉例
import re

str = '<dl>(843) 542-4256</dl> <dl>(431) 270-9664</dl>'
# 找到字符串中全部"數字-數字"格式的字符,其中第一個數字是三位數,第二個數字是四位數
pttn = r'\d\d\d\-\d\d\d\d'
print(re.findall(pttn, str))

# 輸出
['542-4256', '270-9664']
複製代碼

4. 邊界原子

用邊界原子指定邊界。也能夠稱做 「定位操做符」。

^ 匹配被搜索字符串的開始位置;
$ 匹配被搜索字符串的結束位置;
\b 匹配單詞的邊界;er\b,能匹配 coder 中的 er,卻不能匹配 error 中的 er;
\B 匹配非單詞邊界;er\B,能匹配 error 中的 er,卻不能匹配 coder 中的 er。
複製代碼

注:^ 和 $ 在 Python 語言中被 \A 和 \Z 替代。

# 舉例
import re

str = 'never ever verb however everest'
pttn = r'er\b'
print(re.findall(pttn, str))
pttn = r'er\B'
print(re.findall(pttn, str))

# 輸出
['er', 'er', 'er']
['er', 'er']
複製代碼

5. 組合原子

用圓括號 () 將多個單字符原子組合成一個原子,() 內的字符串將被看成一整個原子

注意:
er 是兩個原子,'e' 和緊隨其後的 'r'
[er] 是一個原子,或者 'e' 或者 'r';
(er) 是一個原子,'er'
複製代碼

6. 數量操做符

數量操做符有:+ ? * {n, m}。用來限定位於它們以前的原子容許出現的個數,不加數量限定則表明出現一次且僅出現一次

+ 表明前面的原子必須至少出現一次,即: 出現次數 ≧ 1
? 表明前面的原子最多隻能夠出現一次,即:0 ≦ 出現次數 ≦ 1
* 表明前面的原子能夠不出現,也能夠出現一次或者屢次,即: 出現次數 ≧ 0
{n} 表明以前的原子出現肯定的 n 次;
{n,} 表明以前的原子出現至少 n 次;
{n, m} 表明以前的原子出現至少 n 次,至多 m 次

複製代碼
# 匹配字符串
str = ['google', 'gooogle', 'goooogle', 'goooooogle']

# 遍歷字符串
for str_per in str:
    # o最少出現一次 
    pttn = r'go+gle'
    print(re.findall(pttn, str_per))
    
    # o最多出現一次 
    pttn = r'go?gle'
    print(re.findall(pttn, str_per))

    # o出現次數≧ 0
    pttn = r'go?gle'
    print(re.findall(pttn, str_per))
    
    # o出現至少2次,至多5次
    pttn = r'go{2,5}gle'
    print(re.findall(pttn, str_per))
    
    # 進階:聯立組合原子
    # g 或者 o 最少出現一次
    pttn = r'[go]+gle'
    
    # go 最少出現一次
    pttn = r'(go)+gle'
    print(re.findall(pttn, str_per))
複製代碼

7. 或操做符 |

或操做符 | 是全部操做符中優先級最低的

import re

str = 'begin began begun begins beginn'
pttn = r'begin|began|begun'
print(re.findall(pttn, str))

# 輸出
['begin', 'began', 'begun', 'begin', 'begin']
複製代碼

注:方括號的 | 不被看成特殊符號,而是被看成 | 這個符號自己。在方括號中的圓括號,也被看成圓括號 () 自己,而無分組含義。


Python正則表達式

Python 語言經過導入re 模塊使用正則表達式全部功能。

1. re.match函數

re.match 嘗試從字符串的起始位置匹配一個模式,若是不是起始位置匹配成功的話,match()就返回none。

# 函數語法:
# pattern:匹配的正則表達式
# string:要匹配的字符串。
# flags:標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
re.match(pattern, string, flags=0)

複製代碼
# 匹配字符串,re.I表示對大小寫不敏感
print(re.match('Www', 'www.runoob.com', flags=re.I).span())

# 輸出
(0, 3)
複製代碼

2. re.search函數

掃描整個字符串並返回第一個成功的匹配。

# 函數語法:
# 參數使用同 match 函數
re.search(pattern, string, flags=0)
複製代碼
# 匹配字符串,re.I表示對大小寫不敏感
print(re.search('Www', 'www.runoob.com', flags=re.I).span())

# 輸出
(0, 3)
複製代碼

注:re.match只匹配字符串的開始,而re.search匹配整個字符串,直到找到一個匹配。

3. re.findall函數

在字符串中找到正則表達式所匹配的全部子串,並返回一個列表,若是沒有找到匹配的,則返回空列表。

# 函數語法:
# string 待匹配的字符串。
# pos 可選參數,指定字符串的起始位置,默認爲 0。
# endpos 可選參數,指定字符串的結束位置,默認爲字符串的長度。
re.findall(string[, pos[, endpos]])
複製代碼

注:match 和 search 是匹配一次結果,findall 匹配全部結果。

import re
# 查找數字
pattern = re.compile(r'\d+') 
# 查找字符串中全部的數字
print(pattern.findall('zhiqiu 123 xiaomeng 456'))
# 查找字符串中0-10位的全部數字
print(pattern.findall('zhiqiu88zhiqiu123xiaomeng456', 0, 10))

# 輸出
['123', '456']
['88']
複製代碼

4. re.split函數

split 方法按照可以匹配的子串將字符串分割後返回列表

# 函數語法:
# pattern:匹配的正則表達式
# string:要匹配的字符串。
# maxsplit:分隔次數,maxsplit=1 分隔一次,默認爲 0,不限制次數。
# flags:標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
re.split(pattern, string[, maxsplit=0, flags=0])
複製代碼
# 經過數字做爲分隔符對字符串進行分割
print(re.split('\d+', 'zhiqiu88zhiqiu123xiaomeng456'))

# 輸出:
['zhiqiu', 'zhiqiu', 'xiaomeng', '']
複製代碼

補充:正則表達式修飾符

re.I	使匹配對大小寫不敏感
re.L	作本地化識別(locale-aware)匹配
re.M	多行匹配,影響 ^ 和 $
re.S	使 . 匹配包括換行在內的全部字符
re.U	根據Unicode字符集解析字符。
re.X	該標誌經過給予你更靈活的格式以便你將正則表達式寫得更易於理解。
複製代碼

正則表達式是Python中一個超級實用的一個知識點,不管是在爬蟲的網頁解析仍是在數據清洗中,都很實用,且很是高效,建議掌握!


下節將介紹Python 多線程VS多進程


系列文章傳送門

Python入門進階教程-面向對象

Python入門基礎彙總


Python系列

Python系列會持續更新,從基礎入門到進階技巧,從編程語法到項目實戰。若您在閱讀的過程當中發現文章存在錯誤,煩請指正,很是感謝;若您在閱讀的過程當中能有所收穫,歡迎一塊兒分享交流。

若是你也想和我一塊兒學習Python,能夠關注個人微信公衆號

學習Python,咱們不僅是說說而已

相關文章
相關標籤/搜索