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.'}