突然間學不下去別的東西了,看了眼正規表示式還挺好玩的,學習一下
正規表示式,個人理解就是對複雜字串的一種簡單表示,不過非常專業化,因為沒學過的人看起來會覺得極其***??
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 以及特殊字元 稱為元字元 組成的文字模式,它描述在查詢文字主體時待匹配的乙個或多個字串。正規表示式作為乙個模板,將某個字元模式與所搜尋的字串進行匹配。正規表示式在字元資料處...