python中的正則函數基本用法 - 包括貪心匹配和非貪心匹配 - 正則表達式基本規則

正則表達式基本規則

符號 含義 樣例
\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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章