正則表達式基本規則
符號 | 含義 | 樣例 |
---|---|---|
\d |
代表一個數字字符 | r'\d\d\d' :(表示要求匹配三個連續的數字字符) |
\D |
代表一個非數字字符 | r'\D\D\D' :(表示要求匹配三個連續的非數字字符) |
\w |
代表一個數字、字母或下劃線字符(可以理解成組成單詞的字符) | r'\w\w\w' :(表示要求匹配三個連續的單詞字符) |
\W |
代表一個除數字、字母、下劃線外的任何字符 | ('!@#' 就是一個符合r'\W\W\W' 的匹配項) |
\s |
代表一個空格符或製表符或換行符 | 略 |
\S |
代表一個除空格符、製表符、換行符外的任何字符 | 略 |
() |
分組 | r'(\d\d\d)-(\d\d\d\d)' :(表示分成兩組進行匹配,第一組是三個數字字符,第二組是四個數字字符) |
? |
代表其前面的序列可以出現0次或1次 | r'Hello(Wo)?rld' :(表示匹配Hello,然後wo可以沒有也可以有一組,即Hellorld和HelloWorld都滿足要求) |
* |
代表其前面的序列可以出現0次或多次 | r'Hello(Wo)*rld' :(表示中間的wo可以沒有也可以有任意組,即Hellorld、HelloWorld、HelloWoWo…rld都滿足要求) |
+ |
代表其前面的序列至少出現1次 | r'Hello(Wo)+rld' :(表示匹配Hello,然後wo至少要有一次,即HelloWorld、HelloWo…World都滿足要求,而Hellorld不滿足) |
| |
代表兩邊的模式都可以 | r'Hello (Hi|HI|hi)' :(表示Hello Hi、Hello HI、Hello hi都滿足匹配要求) |
{n,m} |
其前面的序列匹配n~m次 | r'Hello(Wo){3,5}rld' :(表示中間的Wo出現3,4,5次都是滿足匹配要求的,只有"n,“表示0~m,z只有”,m"表示上不封頂,只有一個數字“n”,表示只能匹配n次) |
[] |
分類字符。表示用方括號內的字符匹配當前位置的一個字符 | r'\w{3}[abc123]' :(表示,其前面序列有三個字母、數字、下劃線字符,且只能由"abc123 "這6個字符組成) |
- |
在放括號中使用,表示字符的範圍 | r'123[a-zA-Z]' :(表示,123後面的字符只能是英文字母。方括號內的字符不用轉義) |
^ |
在放括號中使用時,表示除方括號內分類字符意外的其他所有字符 | r'123[^a-zA-Z]' :(表示,123後面不能是英文字母。方括號內的字符不用轉義) |
^ |
頭匹配。在正則表達式的開始處使用,表示匹配必鬚髮生在待查找文本的開始處 | r'^Hello' :(表示,字符串必須以Hello開頭。可以與"$"一起使用) |
$ |
尾匹配。在正則表達式的最後處使用,表示匹配必鬚髮生在待查找文本的結尾處 | r'\d+$' :(表示,字符串必須以至少一個數字結尾。可以與"^"一起使用) |
. |
通配符。可以表示除換行外的所有字符,但只能匹配一個 | r'.at' :(表示,at的前面可以是任意字符,即以at結尾的三字符組合) |
.* |
表示所有文本。貪心模式 | r'aaa(.*)bbb' :(表示由aaa開頭,bbb結尾,中間是任意數量任意字符的序列。注意這個例子中並不要求整個待查序列是以aaa開頭,bbb結尾的。) |
.*? |
表示所有文本。非貪心模式 | r'^aaa(.*)bbb$' :(表示由aaa開頭,bbb結尾,中間是任意數量任意字符的序列。與上面的例子不同,這個例子中要求整個待查序列是以aaa開頭,bbb結尾) |
re包基本正則函數與用法
需要導入re包:
import re
函數名 | 返回類型 | 參數 | 樣例 |
---|---|---|---|
re.compile(regStr) |
Regex對象 | 參數1:字符串形式的正則表達式(建議使用原始字符串) | regex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') |
re.compile(regStr,參數2) |
Regex對象 | 參數2常用方法見文章最後注意事項 | regex = re.compile(r'.*',re.DOTALL) |
regex.search() |
Match對象 | 待查找的字符串 | match = regex.search(r'fdhsakhfkd111-222-3333') |
match.group() |
實際匹配的字符串 | 0或無參:(返回整個匹配字符串); 其他:返回數字表示的匹配部分。 |
match.group() |
match.groups() |
所有分組的元組 | 無 | 同上 |
regex.findall() |
所有匹配字符串的列表(表達式有分組時返回分組的元組列表) | 待查找的字符串 | strList = regex.findall() |
樣例程序:
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
mo = phoneNumRegex.search('My number is 415-555-4242.')
mo.group(1)
mo.group(2)
mo.group(0)
mo.group()
mo.groups()
樣例輸出:
‘415’
‘555-4242’
‘415-555-4242’
‘415-555-4242’
(‘415’,‘555-4242’)
注意事項
1、貪心匹配和非貪心匹配
- Python 的正則表達式默認是“貪心” 的, 這表示在有二義的情況下,它們會盡
可能匹配最長的字符串。花括號的“非貪心” 版本匹配儘可能最短的字符串,即在
結束的花括號後跟着一個問號。
樣例程序:
>>> greedyHaRegex = re.compile(r'(Ha){3,5}') #貪心版本返回最長匹配
>>> mo1 = greedyHaRegex.search('HaHaHaHaHa')
>>> mo1.group()
'HaHaHaHaHa'
>>> nongreedyHaRegex = re.compile(r'(Ha){3,5}?') #非貪心版本返回最短匹配
>>> mo2 = nongreedyHaRegex.search('HaHaHaHaHa')
>>> mo2.group()
'HaHaHa'
2、re.compile(regStr,參數2)中,參數2的常用值
參數 | 含義 | 樣例 |
---|---|---|
re.DOTALL | 讓通配符"."能匹配換行符 | re.compile(r".*",re.DOTALL) :(能將換行符也匹配進去) |
re.I | 字符匹配時忽略大小寫 | re.compile(r"hello",re.I) :(只要是hello,不管怎麼樣的大小寫都匹配) |
re.IGNORECASE | 同re.I | 略 |
re.VERBOSE | 忽略正則表達式字符串(即regStr)中的空白和註釋,以便讓正則表達式可以換行 | 見下面樣例程序 |
樣例程序:
regex = re.compile(r'''(
(\d{3}|\(\d{3}\))? # area code
(\s|-|\.)? # separator
\d{3} # first 3 digits
(\s|-|\.) # separator
\d{4} # last 4 digits
(\s*(ext|x|ext.)\s*\d{2,5})? # extension
)''', re.VERBOSE) #re.VERCASE使程序忽略參數regStr中的空格和註釋
可以使用“|”將2個或3個參數同時使用,例如:
regex = re.compile('foo', re.IGNORECASE | re.DOTALL)
regex = re.compile('foo', re.IGNORECASE | re.DOTALL | re.VERBOSE)