re模塊是python中特有的,但是正則表達式是通用的。
正則表達式介紹
(1)特殊符號處理常用邏輯
符號 | 含義 | 正則表達式 | 可以匹配的例子 | 不可能匹配的例子 |
. | 匹配任一字符 | "a.c" | "abc",''amc" | "addc","addds" |
^ | 匹配以某個字符開始的字符串 | "^a" | "accc" | "vccc" |
$ | 匹配以某個字符結尾的字符串 | "a$" | "csada" | "ssum" |
[] | 匹配多個字符,可以將[]看作字典查找匹配 | "[abcd]" | "ab" |
"mn" |
[^...] | 匹配非字符組中的字符 | "[^abc]" | "ssds" | "abc" |
a|b | 匹配a或者b | "root|cat" | "root" | "big" |
() | 匹配括號內的表達式 | "(k|d)ing" | "ding" | "crying" |
重複型的匹配符號
符號 | 含義 | 正則表達式 | 可以匹配的例子 |
+ | 匹配一次或多次 | "(a|c)+d$" | "ad","caccd" |
* | 匹配零次或多次 | "(a|c)*d$" | "d","aaad" |
? | 匹配零次或一次 | "(a|c)?d$" | "ad","cd","d" |
{n} | 匹配確定的 n次(n爲正整數) | "[0-9]{2}" | "21","26" |
{n,} | 至少匹配n次 | "[0-9]{3,}" | "001","003003" |
{n,m} | 最少匹配 n次且最多匹配 m 次 | "[0-9]{2,4}" | "23","231","6551" |
關於[]一些常用的匹配:
字符 | 含義 |
[0-9] | 匹配0-9這10個數字 |
[a-z] | 匹配a-z這26個小寫字母 |
[A-Z] | 匹配A-Z這26個大寫字母 |
[a-f0-7F-M] | 匹配a-f小寫字母,匹配0-7數字,匹配F-M大寫字母 |
轉義字符 : \
在[]中有一些表達需要看作特殊符號,因此需要用到"\"。如果想要匹配某段文字中的一個"\",則需要4個反斜槓"\\\\"(在正則中需要4個)。解釋:前兩個反斜槓出來一個"\",後兩個反斜槓也出來一個"\",這兩個被送進正則表達中,由於"\"在正則中,有轉義的作用,因此"\\"被翻譯成一個普通的斜槓。
這時,可以利用原聲字符串來解決這個問題,上面的這個可以寫成 r"\\",即"\\"不轉義直接送到正則表達式中,因此正則表達式讀取後就是"\"。
在正則表達式中,轉義字符加一些字母有一些特殊的意思,如下表所示。
字符 | 說明 | 正則表達式 | 可以匹配的例子 | 不可以匹配的例子 |
\d | 匹配一個數字 | "aca\d" | "aca2" | "acas" |
\s | 匹配任意空白符 | "a\sb" | "a b" (一個空格) | "abb" |
\t | 匹配一個製表符 | "\t" | ||
\n | 匹配一個換行符 | "\nA" | ||
\w | 匹配字母、數字、下劃線 | "a\wc" | "a_c" | "a$c" |
\f | 匹配一個換頁符 | |||
\b | 匹配一個單詞邊界 |
re模塊常用函數
(1) re.match(regex, string, flags=0)
從字符串的起始位置匹配,匹配成功返回一個match對象,否則返回None
import re
regex = "a.c"
string = "abc"
print(re.match(regex,string))
output:
<_sre.SRE_Match object; span=(0, 3), match='abc'>
#含義:begin position:0 ;end position:3;match string is "abc"
(2) re.search(regex,string)
掃描整個字符串並返回第一個成功的匹配的,如果沒有就返回None
import re
regex = r"\d.\\c"
string = "1A\c2\sc"
print(re.search(regex,string))
output:
<_sre.SRE_Match object; span=(0, 4), match='1A\\c'>
(3)re.sub(regex, repl, string, count=0, flags=0)
替換字符串中的匹配項, regex 正則中的模式字符串,repl替換的字符串
count : 模式匹配後替換的最大次數,默認 0 表示替換所有的匹配
flags是一個標誌位,不怎麼用不寫了。
import re
regex = r'#.*$'
string = "2004-959-559 # 這是一個國外電話號碼"
print(re.sub(regex,"",string))
output:
2004-959-559
(4)re.compile(regex)
生成一個帶有regex正則表達式的對象,供其他函數split,match,search使用。例子看(5)。
(5)re.split(regex, string,maxsplit)
按照能夠匹配的子串將字符串分割後返回列表
import re
regex = "[a|b]+c"
pattern = re.compile("[a|b]+c")
string = "acbcbdcksnfcvscdbcacccbc"
print(re.split(regex,string,maxsplit=3)) #最大分隔3次
print(pattern.split(string))
output:
['', '', 'bdcksnfcvscd', 'acccbc']
['', '', 'bdcksnfcvscd', '', 'cc', '']
(6)re.findall(string,begin,end)
從字符串中找到匹配的所有子串,作爲列表返回;如果沒有找到匹配的,則返回空列表。
import re
pattern = re.compile("[a|b]+c")
string = "acbcbdcksnfcvscdbcacccbc"
print(pattern.findall(string))
print(pattern.findall(string,5,len(string)))
### 從5位置開始匹配直到結尾
output:
['ac', 'bc', 'bc', 'ac', 'bc']
['bc', 'ac', 'bc']
(7)re.finditer(string)
與re.findall 類似,在字符串中找到正則表達式所匹配的所有子串,並把它們作爲一個迭代器返回。
import re
pattern = re.compile("[a|b]+c")
string = "acbcbdcksnfcvscdbcacccbc"
match = []
for i in pattern.finditer(string):
match.append(i.group(0))
print(match)
output:
['ac', 'bc', 'bc', 'ac', 'bc']
參考: