正規表示式 基礎知識

2021-08-24 23:17:56 字數 4124 閱讀 8347

突然間學不下去別的東西了,看了眼正規表示式還挺好玩的,學習一下

正規表示式,個人理解就是對複雜字串的一種簡單表示,不過非常專業化,因為沒學過的人看起來會覺得極其***??

0x00. 準備:

利用python自帶的re模組學習

其實只用到了兩個功能,分別是:

re.complier() :裡面輸入我們要匹配的正規表示式規則

re.findall():裡面輸入需要匹配的字串

import re

rule = re.compile(r'')

test_str = ""

print(rule.findall(test_str))

準備完畢,接下來開始學習和測試結果!

0x01.元字元:

先只了解一些常見的元字元就夠了,其他的等需要的時候再找

\b :匹配單詞的開始和結束

import re

rule1 = re.compile(r'he')

rule2 = re.compile(r'\bhe\b')

test_str = "he,hello,hell,hey"

print(rule1.findall(test_str))

print(rule2.findall(test_str))

# result

['he', 'he', 'he', 'he']

['he']

上述的**以及結果可以看出如果不在單詞兩邊加\b,正規表示式就會識別所有包含he的單詞(比如hello,she這類),而不是正好找到he這個單詞。

.   :匹配除了換行以外的其他字元

比如我們要尋找h開頭的長度為3的單詞:

import re

rule1 = re.compile(r'\bh..\b')

test_str = "hello,hell,his"

print(rule1.findall(test_str))

# result

['his']

\s :匹配任意的空白符,比如空格和tab等

\d :匹配數字0-9:

import re

rule1 = re.compile(r'\b\d\d\d\b')

test_str = "123,1625,19282,878,999"

print(rule1.findall(test_str))

# result

['123', '878', '999']

\w:匹配字母或數字或下劃線或漢字,和\d一樣

^  :匹配字串開始

$ :匹配字串結束

import re

rule1 = re.compile(r'\d\d\d')

rule2 = re.compile(r'^\d\d\d$')

test_str = "1234"

print(rule1.findall(test_str))

print(rule2.findall(test_str))

# result

['123']

可以看到對於「1234」這個字串,\d\d\d 匹配的原則是只要這個字串裡面有三個數字即可,而加了開始結束後則表現為整個字串必須只由三個數字完全構成

\加上正規表示式中有意義的符號則表現為轉移符號,這點跟大多數程式語言想通。

0x02.重複:

*重複零次或更多次

+重複一次或更多次

?重複零次或一次

重複n次

重複n次或更多次

重複n到m次

可以看一下*, +, ? 的區別:

import re

rule1 = re.compile(r'\bsa\d*\b') # 表示sa開頭且後面有0-n個數字

rule2 = re.compile(r'\bsa\d+\b') # 表示sa開頭且後面至少有乙個數字

rule3 = re.compile(r'\bsa\d?\b') # 表示sa開頭且後面有0/1個數字

test_str1 = "sa"

test_str2 = "sa11"

print(rule1.findall(test_str1))

print(rule1.findall(test_str2))

print(rule2.findall(test_str1))

print(rule2.findall(test_str2))

print(rule3.findall(test_str1))

print(rule3.findall(test_str1))

# result

['sa']

['sa11']

['sa11']

['sa']

['sa']

{}用法類似不再重複

0x03.字元類:

[  ]  :  用於匹配預先沒有定義過的字符集,比如說[1,2,3,4,5], [a,e,i,o,u]等這些,然後這個括號就可以當成元字元來進行操作

當然對於也可以指定字元範圍,比如說[0-9],

還有[a-z0-9a-z]這種寫法

例如我們要檢測乙個使用者名稱以字母開頭,且長度不超過10,只能包含數字字母下劃線:

rule1 = re.compile(r'^[a-za-z]\w$')

test_str1 = "a9s92" # 合法使用者名稱

test_str2 = "7askk" # 開頭不是字母

test_str3 = "a1234567890" # 長度超過10

print(rule1.findall(test_str1))

print(rule1.findall(test_str2))

print(rule1.findall(test_str3))

# result

['a9s92']

0x04.分支:

表示式1|表示式2|...:

把不同的表示式用  |  來分割,只要字串滿足其中任意一條,就匹配,當然是從左到右進行檢測。

如果哪個表示式匹配了,則不再繼續檢測後面的表示式。

0x05.分組:

也就是用來重複多個字元的操作

用( ) 把想要多此重複的多字元括起來

顯示結果有一點問題還未找到原因而且表示式有點醜:

import re

rule1 = re.compile(r'^(((2[0-4]\d|25[0-5]|1[0-9]|[1-9]\d|\d)\.)((2[0-4]\d|25[0-5]|1[0-9]|[1-9]\d|\d)))$')

test_str1 = "192.168.11.74"

test_str2 = "256.191.292.33"

test_str3 = "188.90.888.1"

print(rule1.findall(test_str1))

print(rule1.findall(test_str2))

print(rule1.findall(test_str3))

# result

[('192.168.11.74', '11.', '11', '74', '74')]

0x06.反義\w

匹配任意不是字母,數字,下劃線,漢字的字元

\s匹配任意不是空白符的字元

\d匹配任意非數字的字元

\b匹配不是單詞開頭或結束的位置

[^x]

匹配除了x以外的任意字元

[^aeiou]

匹配除了aeiou這幾個字母以外的任意字元

記憶起來就是元字元小寫對應成對應的大寫,字元類之前加上^即可,用法上沒什麼區別。

正規表示式基礎知識

我們先從簡單的開始。假設你要搜尋乙個包含字元 cat 的字串,搜尋用的正規表示式就是 cat 如果搜尋對大小寫不敏感,單詞 catalog catherine sophisticated 都可以匹配。也就是說 1.1 句點符號 假設你在玩英文拼字遊戲,想要找出三個字母的單詞,而且這些單詞必須以 t ...

正規表示式基礎知識

乙個正規表示式就是由普通字元 例如字元 a 到 z 以及特殊字元 稱為元字元 組成的文字模式。該模式描述在查詢文字主體時待匹配的乙個或多個字串。正規表示式作為乙個模板,將某個字元模式與所搜尋的字串進行匹配。如 jscript vbscript 匹配 t t 匹配乙個空白行。d d d d 驗證乙個i...

正規表示式基礎知識

正規表示式基礎知識 正規表示式是一種可以用於模式匹配和替換的強有力的工具,乙個正規表示式就是由普通的字元 例如字元 a 到 z 以及特殊字元 稱為元字元 組成的文字模式,它描述在查詢文字主體時待匹配的乙個或多個字串。正規表示式作為乙個模板,將某個字元模式與所搜尋的字串進行匹配。正規表示式在字元資料處...