1、正則匹配中的「組(group)」的概念.html
當re模塊中的函數,找到匹配項的時候,返回MatchObject對象。這些對象包括匹配模式的子字符串的信息。它們還包含錄哪一個模式匹配了子字符串那部分的信息,這些部分就是不一樣的「組」。python
組就是放在圓括號內的子模式。組的序號取決於在它的左側的括號的數量,組0就是整個模式,例: git
'Django (is a( nice web)) (framework).' 包含如下幾個模式: 0 Django is a nice web framework. 1 is a nice web 2 nice web 3 framework >>> pat = re.compile(r'Django (is a (nice web)) (framework)') >>> m = pat.match("Django is a nice web framework") >>> m <_sre.SRE_Match object; span=(0, 30), match='Django is a nice web framework'> >>> m.groups() ('is a nice web', 'nice web', 'framework') >>> m.group(0) 'Django is a nice web framework' >>> m.group(1) 'is a nice web' >>> m.group(2) 'nice web' >>> m.group(3) 'framework' >>> m.group(4) Traceback (most recent call last): File "<input>", line 1, in <module> m.group(4) IndexError: no such group
2、正則表達式sub方法。web
sub是模塊函數也是re對象的方法。正則表達式
模塊函數原型:re.sub(pattern, repl, string, count=0, flags=0)django
類方法原型: regex.sub(repl, string, count=0)函數
repl能夠是函數能夠是字符串。測試
一、repl爲字符串url
import re text = "hello! {name},{name},{name}" pat2 = re.compile(r"{name}") bar = pat2.sub("xiao", text) print(bar) ➜ python3 python3 re_test.py hello! xiao,xiao,xiao
二、repel在字符串中使用反向引用(反斜槓替換)(Backreferences): spa
import re pat3 = re.compile(r"{(.+)}") foo = pat3.sub(r"<html>\1</html>", "{title}") print(foo) ➜ python3 python3 re_test.py <html>title</html>
其中repel中的"\1"是反向引用group 1的內容。這裏測試如下不能使用"\0",使用會返回一個空值,暫時我給不出很好的解釋,回頭填這個坑。
三、repel爲函數的時候,repel的函數回獲取一個MatchObjects做爲其參數。
import re def foo(arg): return str(arg.groups()) pat3 = re.compile(r"{(.+)}") bar = pat3.sub(foo, "{title}") print(bar) ➜ python3 python3 re_test.py ('title',)
3、正則匹配對象MatchObjects
這裏只記一個方法match.groupdict.
能夠用字字符串爲沒有組命名。命名方式是:
(?P<name>mode)
這樣這個這子模式就被命名爲name,django中使用正則來匹配url,這個中給子模式命名方式會使用到,很方便。
import re pat4 = re.compile(r"<p>(?P<text>.+)</p>") m = pat4.search("<p>My first paragraph.</p>") print(m.groupdict()) ➜ re_blog git:(master) ✗ python3 re_test.py {'text': 'My first paragraph.'}