一、正则匹配中的“组(group)”的概念.
当re模块中的函数,找到匹配项的时候,返回MatchObject对象。这些对象包括匹配模式的子字符串的信息。它们还包含录哪个模式匹配了子字符串那部分的信息,这些部分就是不同的“组”。
组就是放在圆括号内的子模式。组的序号取决于在它的左侧的括号的数量,组0就是整个模式,例:
'Django (is a( nice web)) (framework).'包含以下几个模式:0 Django is a nice web framework.1 is a nice web2 nice web3 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 "", line 1, inm.group(4)IndexError: no such group
二、正则表达式sub方法。
sub是模块函数也是re对象的方法。
模块函数原型:re.sub(pattern, repl, string, count=0, flags=0)
类方法原型: regex.sub(repl, string, count=0)
repl可以是函数可以是字符串。
1、repl为字符串
import retext = "hello! {name},{name},{name}"pat2 = re.compile(r"{name}")bar = pat2.sub("xiao", text)print(bar)➜ python3 python3 re_test.pyhello! xiao,xiao,xiao
2、repel在字符串中使用反向引用(反斜杠替换)(Backreferences):
import repat3 = re.compile(r"{(.+)}")foo = pat3.sub(r"\1", "{title}")print(foo)➜ python3 python3 re_test.pytitle
其中repel中的"\1"是反向引用group 1的内容。这里测试以下不能使用"\0",使用会返回一个空值,暂时我给不出很好的解释,回头填这个坑。
3、repel为函数的时候,repel的函数回获取一个MatchObjects作为其参数。
import redef foo(arg): return str(arg.groups())pat3 = re.compile(r"{(.+)}")bar = pat3.sub(foo, "{title}")print(bar)➜ python3 python3 re_test.py('title',)
三、正则匹配对象MatchObjects
这里只记一个方法match.groupdict.
可以用字字符串为没有组命名。命名方式是:
(?P<name>mode)
这样这个这子模式就被命名为name,django中使用正则来匹配url,这个中给子模式命名方式会使用到,很方便。
import re pat4 = re.compile(r"(?P
.+) ")m = pat4.search("My first paragraph.
")print(m.groupdict())➜ re_blog git:(master) ✗ python3 re_test.py{'text': 'My first paragraph.'}