標籤:模式比對 sans targe 運算式 字母數 字元集 tool .com 其他
re模組
可以讀懂你寫的Regex
根據你寫的運算式去執行任務
用re去操作正則
Regex
使用一些規則來檢測一些字串是否符合個人要求,從一段字串中找到符合要求的內容。線上測試網站: http://tool.chinaz.com/regex/
元字元:更加籠統的匹配
元字元 |
匹配內容 |
. |
匹配除分行符號以外的任一字元 |
^ |
只匹配字串的開始 |
$ |
只匹配字串的結束 |
\w |
匹配字母或數字或底線 |
\s |
匹配任意空白符 |
\d |
匹配數字 |
\n |
匹配一個分行符號 |
\t |
匹配一個定位字元 |
\W |
匹配非字母數字和底線 |
\S |
匹配非空白符 |
\D |
匹配非數字 |
a|b |
匹配字元a或b |
() |
匹配括弧內的運算式,也表示一個組 |
[ ] |
匹配字元組的字元 |
[^ ] |
匹配除了字元組中字元的所有字元 |
量詞:
量詞 |
用法說明 |
* |
重複零次或更多次 |
+ |
重複一次或更多次 |
? |
重複零次或一次 |
{n} |
重複n次 |
{n,} |
重複n次或更多次 |
{n,m} |
重複n到m次 |
.*?的用法說明:
. 任一字元
* 取0至無限長度
? 非貪婪模式
.*?x 合在一起表示取盡量少的任一字元,知道一個x出現
其他使用說明:
* + ? { }:
註: *,+,?等都是貪婪匹配,也就是儘可能匹配,後面加?號使其變成惰性匹配
字元集[][^]:
分組 ()與 或 |[^]:
社會安全號碼是一個長度為15或18個字元的字串,如果是15位則全部由數字組成,首位不能是0
如果是18位,則前17位全部是數字,末尾可能是x
轉義符 \:
在正則中,存在很多特殊意義的元字元,如\d,\s等,如果要在正則中匹配正常的‘\d’而不是‘數字’就需要對‘\d’進行轉義,變成‘\\’
在py中,無論是Regex還是待匹配內容都是以字串形式出現的,字串中\也有特殊含義,本身也需要轉義,這時候就要用到r‘\d’轉換
貪婪匹配:
滿足匹配時,匹配儘可能長的字串
幾個常用非貪婪匹配格式
re模組下的常用方法
import reret = re.findall(‘a‘, ‘eva egon yuan‘)print(ret) # [‘a‘, ‘a‘]ret = re.findall(‘\d+‘, ‘dsaglhlkdfh1892494kashdgkjh127839‘)print(ret) # [‘1892494‘, ‘127839‘]# findall接收兩個參數 : Regex 要匹配的字串# 一個列表資料類型的傳回值:所有和這條正則匹配的結果ret = re.search(‘a‘, ‘eavegonyaun‘).group()print(ret) # a# 函數會在字串內尋找模式比對,直到找到第一個匹配然後返回一個包含匹配資訊的對象,該# 對象可以通過調用group()方法得到匹配的字串,如果字串沒有匹配,未調用group時# 則返回None。# search和findall的區別:# 1.search找到一個就返回,findall是找所有# 2.findall是直接返回一個結果的列表,search返回一個對象ret = re.match(‘a‘, ‘eva egon yuan‘)if ret: print(ret.group())# 意味著在Regex中添加了一個^# 同search,不過盡在字串開始處進行匹配ret = re.sub(‘\d‘, ‘H‘, ‘eva3egon4yuan4‘, 2)print(ret) # evaHegonHyuan4# 將前兩個數字換成Hret = re.subn(‘\d‘, ‘H‘, ‘eva3egon4yuan4‘)print(ret) # (‘evaHegonHyuanH‘, 3)# #將數字替換成‘H‘,返回元組(替換的結果,替換了多少次)ret = re.split("\d+", "eva3egon4yuan")print(ret) # [‘eva‘, ‘egon‘, ‘yuan‘]ret = re.split("(\d+)", "eva162784673egon44yuan")print(ret) # [‘eva‘, ‘3‘, ‘egon‘, ‘4‘, ‘yuan‘]# split分割一個字串,預設被匹配到的分隔字元不會出現在結果清單中,# 如果將匹配的正則放到組內,就會將分隔字元放到結果清單裡# 在多次執行同一條正則規則的時:obj = re.compile(‘\d{3}‘)ret1 = obj.search(‘abc123eeee‘)ret2 = obj.findall(‘abc123eeee‘)print(ret1.group()) # 123print(ret2) # [‘123‘]# 如果匹配檔案中的手機號,可以進行這樣的一次編譯,節省時間# finditer適用於結果比較多的情況下,能夠有效節省記憶體ret = re.finditer(‘\d‘, ‘ds3sy4784a‘)print(ret) # <callable_iterator object at 0x10195f940>print(next(ret).group()) # 查看第一個結果print(next(ret).group()) # 查看第二個結果print([i.group() for i in ret]) # 查看剩餘的左右結果
分組:
如果對一組Regex整體有一個量詞約束,就將這一組表達是分成一個組
# 當分組遇到re模組import reret1 = re.findall(‘www.(baidu|oldboy).com‘, ‘www.baidu.com‘)ret2 = re.findall(‘www.(?:baidu|oldboy).com‘, ‘www.baidu.com‘)print(ret1)print(ret2)# findall會優先顯示組內匹配到的內容返回# 如果想取消分組優先效果,在組內開始的時候加上?:# 分組的意義# 1.對一組正則規則進行量詞約束# 2.從一整條正則規則匹配的結果中優先顯示組內的內容# "<h1>hello</h1>"ret = re.findall(‘<\w+>(\w+)</\w+>‘, "<h1>hello</h1>")print(ret) # [‘hello‘]# 分組命名ret = re.search("<(?P<tag>\w+)>(?P<content>\w+)</(?P=tag)>", "<h1>hello</h1>")print(ret.group()) # <h1>hello</h1>,search中沒有分組優先的概念print(ret.group(‘tag‘)) # h1print(ret.group(‘content‘)) # hello# 如果不給組起名字,也可以用\序號來找到對應的組,表示要找的內容和前面的組內容一致# 擷取的匹配結果可以直接用group(序號)拿到對應的值ret = re.search(r"<(\w+)>(\w+)</\1>", "<h1>hello</h1>")print(ret.group()) # <h1>hello</h1>print(ret.group(0)) # <h1>hello</h1>print(ret.group(1)) # h1print(ret.group(2)) # hello
16.python模組之正則