正則運算式中字符主要分為兩類,一類是普通字符,一類是特殊字符,
普通字符舉例:
下面是一串阿里云服務器所在地域,城市,region id,和可用區數量的對照關系
華北 1 青島 cn-qingdao 2
華北 2 北京 cn-beijing 8
華北 3 張家口 cn-zhangjiakou 3
華北 5 呼和浩特 cn-huhehaote 2
華北 6 烏蘭察布 cn-wulanchabu 2
華東 1 杭州 cn-hangzhou 8
華東 2 上海 cn-shanghai 7
華南 1 深圳 cn-shenzhen 5
華南 2 河源 cn-heyuan 2
華南 3 廣州 cn-guangzhou 2
西南 1 成都 cn-chengdu 2
假如我們要找到所有華北的服務器,那么我們可以直接使用“華北”這個關鍵字來找到符合的選項,如下圖:

這里華北就是一個普通字符,類似的例如普通英文字母也是一個普通字符,而特殊字符指的是這些字符不是用來匹配原來文本中的內容(很多情況下這些特殊字符在原來文本中就不會出現),這些特殊字符是為了特殊的用法來實作的,分別有不同的含義,下面就是這些特殊字符,我們來一個一個學習用法.
. * + ? \ [ ] ^ $ { } | ( )
第一個特殊字符 . 點
. 表示要匹配除了 換行符 之外的任何 單個 字符,
例如我們要在之前阿里云服務器地點那個例子中找出所有服務器所在地域有“南”字的,觀察得知有華南,也有西南,這時候簡單的方法就是搜索“.南”

點號放在前面后面都一樣,甚至可以多加幾個,例如我們要找到所有華北地區的服務器,注意格式是“華北”+“空格”+“數字”,那么就可以用兩個點號來代替兩個字符,如下

在python代碼中,就可以用過re來提取相關的內容,首先import re(re是正則運算式的庫),定義正則運算式,然后用一個for回圈,輸出所有符合條件的內容,注意p=re.compile(r’.南’)中的r是禁止python本身對正則運算式的內容進行轉義(因為某些特殊字符在python中有特殊含義,會被python識別陳別的指令,加入r的意思就是我不需要轉義,直接就按照用戶定義的原始字符去搜)
content='''
華北 1 青島 cn-qingdao 2
華北 2 北京 cn-beijing 8
華北 3 張家口 cn-zhangjiakou 3
華北 5 呼和浩特 cn-huhehaote 2
華北 6 烏蘭察布 cn-wulanchabu 2
華東 1 杭州 cn-hangzhou 8
華東 2 上海 cn-shanghai 7
華南 1 深圳 cn-shenzhen 5
華南 2 河源 cn-heyuan 2
華南 3 廣州 cn-guangzhou 2
西南 1 成都 cn-chengdu 2
'''
import re
p = re.compile(r'.南')
for one in p.findall(content):
print(one)
運行結果如下:

第二個特殊字符 星號
- 表示匹配前面的子運算式任意次,包括0次,
例如在我們的例子中選擇所有地域中有1的服務器資訊,那么這時候正則運算式就是1.*

如何理解呢?首先1是我們需要匹配的第一個字符,接著是點號,點號表示任意字符,然后星號就表示這之后所有的字符(就是符合1.這個運算式的任意次),假如不輸入星號,只輸入1. 那么結果如下:

放到pycharm(或者vs code)中試試,代碼如下
content='''
華北 1 青島 cn-qingdao 2
華北 2 北京 cn-beijing 8
華北 3 張家口 cn-zhangjiakou 3
華北 5 呼和浩特 cn-huhehaote 2
華北 6 烏蘭察布 cn-wulanchabu 2
華東 1 杭州 cn-hangzhou 8
華東 2 上海 cn-shanghai 7
華南 1 深圳 cn-shenzhen 5
華南 2 河源 cn-heyuan 2
華南 3 廣州 cn-guangzhou 2
西南 1 成都 cn-chengdu 2
'''
import re
p = re.compile(r'1.*')
for one in p.findall(content):
print(one)
運行結果如下:

第三個特殊字符 加號
- 表示匹配前面的子運算式一次或多次,不包括0次,
加號和星號的區別在于加號不包括0次,而星號包括0次
這次我們例子換一下,以下字符:
華北 1青島cn-qingdao2
華北 2北京cn-beijing8
華北 3張家口cn-zhangjiakou3
華北 5呼和浩特cn-huhehaote2
華北 6烏蘭察布cn-wulanchabu2
華東 1杭州cn-hangzhou8
華東 2上海cn-shanghai7
華南 1
華南 2河源cn-heyuan2
華南 3廣州cn-guangzhou2
西南 1成都cn-chengdu2
我們選出所有區域名字帶1的后面的內容,如果后面的資訊是缺失的是空的,我們就不選,如果使用1.* 結果如下

我們發現“華南1”后面沒有資料,不是我們想選取的內容,但是還是被選取了進來,因為*表示符合前面的子運算式任意次數(包括0次),“華南1”后面沒有符合要求的,因此是0次,還是會被選中,這時候就需要使用加號,因為加號排除了0次,直接找至少一次符合條件的,因為“華南1”后面沒有任何字符,因此就不會被選中了. 如下,使用1.+就可以排除掉“華南1”,

第四個特殊字符 問號
? 表示匹配前面的子運算式0次或1次,
沿用加號的例子,這里1.?表示也會把“華南1”選上,為啥呢?因為“華南1”之后沒有任何字符,因此匹配問號前面的子運算式“1.”的次數為0次,因此還是會被選擇上

問號:貪婪和非貪婪模式
假如我們有這樣一串字符,
‘<華北 1青島cn-qingdao2><華北 2北京cn-beijing8><華北 3張家口cn-zhangjiakou3><華北
5呼和浩特cn-huhehaote2><華北 6烏蘭察布cn-wulanchabu2><華東 1杭州cn-hangzhou8><華東
2上海cn-shanghai7><華南 1><華南 2河源cn-heyuan2><華南 3廣州cn-guangzhou2><西南
1成都cn-chengdu2>’
我們想提取之后變成變成這樣,即每個尖括號里面的內容都被單獨提取出來
<華北 1青島cn-qingdao2>
<華北 2北京cn-beijing8>
<華北 3張家口cn-zhangjiakou3>
<華北 5呼和浩特cn-huhehaote2>
<華北 6烏蘭察布cn-wulanchabu2>
<華東 1杭州cn-hangzhou8>
<華東 2上海cn-shanghai7>
<華南 1>
<華南 2河源cn-heyuan2>
<華南 3廣州cn-guangzhou2>
<西南 1成都cn-chengdu2>
如果我們用<.+> 來提取,會顯示只有一個符合的,整個一大段都符合,這是為什么呢?

因為此時正則運算式的貪婪模式是開啟的,因此會會盡可能多的匹配內容,這時候這段文本開頭的“<”和文本最末尾的 “>”會構成一個完整的符合搜索條件的內容,因此,匹配只會出現一個match(即一個符合的選項)
要修改很簡單,在”<.+>”內部的“+”號后面添加一個問號(?)即可以使用非貪婪模式,這樣再運行一遍,就可以分割開來了,如下,可以看見,現在我們出現了11個match,
第五個特殊字符 花括號{}
花括號表示 前面的字符匹配 指定的次數
例如下面的文本:
1,11,111,1111,11111,111111
運算式1{2}表示匹配連續的“1”兩次,如下,一共出現了9個符合的

如果在花括號里面再加一個數字,例如運算式1{4,5},就會尋找有出現連續的“1”最少4次,最多5次的符合選項,如下,最后有三個match

第六個特殊字符反斜杠 \
假設有下方字串:
'<華北 1青島.cn-qingdao2>
<華北 2北京.cn-beijing8>
<華北 3張家口.cn-zhangjiakou3>
<華北 5呼和浩特.cn-huhehaote2>
<華北 6烏蘭察布.cn-wulanchabu2>
<華東 1杭州.cn-hangzhou8>
<華東 2上海.cn-shanghai7>
<華南 1><華南 2河源.cn-heyuan2>
<華南 3廣州.cn-guangzhou2>
<西南 1成都.cn-chengdu2>'
我們提取. 點號后面的文本(包括點號)
這時我們如果使用…?或者…+就會發現,根本無法選擇我們想要的,因為.點號是作為一個特殊符號表示要匹配除了 換行符 之外的任何 單個 字符.因此這里我們需要用反斜杠來轉義,所以得寫成…*,如下
轉義

繼續使用上面的例子,我們看看\反斜杠還有什么用途,反斜杠后面接一些字符,表示匹配 某種型別 的一個字符,
\d 匹配0-9之間任意一個數字字符,等價于運算式 [0-9]

\D 匹配任意一個不是0-9之間的數字字符,等價于運算式 [^0-9]
意思就是所有不是0-9數字的元素,都選擇上

\s 匹配任意一個空白字符,包括 空格、tab、換行符等,等價于運算式 [\t\n\r\f\v]

\S 匹配任意一個非空白字符,等價于運算式 [^ \t\n\r\f\v]

\w 匹配任意一個文字字符,包括大小寫字母、數字、下劃線,等價于運算式 [a-zA-Z0-9_]

預設情況也包括 Unicode文字字符,如果指定 ASCII 碼標記,則只包括ASCII字母
\W 匹配任意一個非文字字符,等價于運算式 [^a-zA-Z0-9_]

…接下來的點進主頁見正則運算式(二)
有疑問滴滴V:mutou88848

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/304764.html
標籤:python
