元字符和其含義
. 匹配除換行符以外的任意字符
\ 轉義字符,使后一個字符改變原來的意思
\w 匹配字母、數字、下划線:[A-Za-z0-9_]
\W 匹配特殊字符:[^A-Za-z0-9_]
\s 匹配任意的空白符:[<空格>\t\r\n\f\v]
\S 匹配非空白符
\d 匹配數字
\D 匹配非數字
\n 匹配一個換行符
\t 匹配一個制表符
\b 匹配一個單詞的結尾
* 匹配前一個字符零次或更多次
+ 匹配前一個字符一次或更多次
? 匹配前一個字符零次或一次
^ 匹配字符串的開始
$ 匹配字符串的結尾
| 匹配|左右表達式中的任意一個
() 匹配括號內的表達式,也表示一個組
[...] 匹配字符組中的字符
[^...] 匹配除了字符組中字符的所有字符
{n} 匹配前一個字符n次
{n,} 匹配前一個字符n次或更多次
{n,m} 匹配前一個字符n到m次
# 幾個常用的非貪婪匹配Pattern
*? 重復任意次,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{n,m}? 重復n到m次,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復
.*?x 就是取前面任意長度的字符,直到一個x出現
re.compile(pattern,flags=0)
pattern: 編譯時用的表達式字符串。
flags 編譯標志位,用於修改正則表達式的匹配方式,如:是否區分大小寫,多行匹配等。
e.S(DOTALL) 使.匹配包括換行在內的所有字符
re.I(IGNORECASE) 使匹配對大小寫不敏感
re.L(LOCALE) 做本地化識別(locale-aware)匹配,法語等
re.M(MULTILINE) 多行匹配,影響^和$
re.X(VERBOSE) 該標志通過給予更靈活的格式以便將正則表達式寫得更易於理解
re.U 根據Unicode字符集解析字符,這個標志影響\w,\W,\b,\B
re.match(pattern, string, flags).group()
嘗試從字符串的開始匹配一個模式如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;
# 第一個參數是正則表達式,如果匹配成功,則返回一個Match,否則返回一個None;
# 第二個參數表示要匹配的字符串;
# 第三個參數是標致位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
a=re.search(pattern, string, flags).group()
匹配整個字符串,只到找到第一個匹配然后返回,如果字符串沒有匹配,則返回None。
re.sub(pattern, repl, string, count=0, flags=0)
用於替換字符串中的匹配項。
# 第四個參數指替換個數。默認為0,表示每個匹配項都替換。
re.split(pattern, string, maxsplit=0, flags=0)
將字符串按空格分割成一個單詞列表。
# re.split(',','123,456') # ['123', '456']
split的優先級查詢
# 沒有()的沒有保留所匹配的項,但是有()的卻能夠保留了匹配的項
# r = re.split('(,)','123,456') # ['123', ',', '456']
re.findall(pattern, string, flags=0)
匹配字符串所有的內容,把匹配到的字符串以列表的形式返回
findall的優先級查詢:
?: 在有分組的情況下findall()函數,只拿分組里的字符串,拿所有匹配到的字符串,
如果想要匹配結果,取消權限即可:(?:[0-9])
re.finditer(pattern, string, flags=0)
返回一個存放匹配結果的迭代器
命名分組匹配:
分組的意義,就是在匹配成功的字符串中,再提取()里面的字符串
ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
# 還可以在分組中利用?<name>的形式給分組起名字
# 如果不給組起名字,也可以用\序號來找到對應的組,表示要找的內容和前面的組內容一致
# 獲取的匹配結果可以直接用group('名字')或group(序號)拿到對應的值