前言
不知不觉,正则表达式已经来到了第四节啦!
今天要聊点什么呢?嗯...
对了,上节讲到的 匹配对象
,好像提到过好几次,但是都没讲它是啥。
抓紧时间,废话少说,今天就聊聊它吧。
匹配对象
介绍
匹配对象,顾名思义就是匹配成功所返回的存储了匹配信息的对象
如果没有匹配的话会返回 None
。
所以你可以简单的用 if
语句来判断是否匹配。
像 match()
和 search()
匹配成功都会返回一个 匹配对象
match = re.search(pattern, string)
if match:
process(match)
常用方法和属性
1、group
介绍
Match.group([group1, ...])
返回一个或者多个匹配的子组。
-
如果只有一个参数,结果就是一个字符串
-
如果有多个参数,结果就是一个元组(每个参数对应一个项)
-
如果没有参数,
group1
参数默认等于0
(即返回整个匹配) -
如果一个组号是负数,或者大于样式中定义的组数,抛出一个
IndexError
索引错误。 -
如果分组被命名, 那么
groupN
参数就可以是命名组合的名字 -
如果一个组匹配了多次,就只返回最后一个匹配
示例
m = re.match(r"(\w+) (\w+)", "Lebron James, Kobe")
m.group()
# out: 'Lebron James'
m.group(0)
# out: 'Lebron James'
m.group(1)
# out: 'Lebron'
m.group(2)
# out: 'James'
m.group(1, 2)
# out: ('Lebron', 'James')
m.group(3)
# out: 'IndexError: no such group'
# 命名分组
m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Lebron James")
m.group('first_name') # ==> m.group(1)
# out: 'Lebron',依旧可以使用数字索引
m.group('last_name') # ==> m.group(2)
# out: 'James'
# 多次匹配,返回最后一个匹配
m = re.match(r"(..)+", "aabbcc")
m.group(1)
# out: 'cc'
其实,上述 group(n)
可以直接通过 m[n]
获取
m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Lebron James")
m[0]
# out: 'Lebron James'
m[1]
# out: 'Lebron'
m[2]
# out: 'James'
2、groups
介绍
Match.groups(default=None)
返回一个包含所有匹配子组的元组,
default
参数设置匹配不成功时的返回值,默认为 None
。
示例
m = re.match(r"(\d+)\.(\d+)", "3.1415926")
m.groups()
# out: ('3', '1415926')
# 设置未匹配的返回值
m = re.match(r"(\d+)\.?(\d+)?", "345")
m.groups()
# out: ('345', None)
m.groups(-1)
# out: ('345', -1)
3、groupdict
介绍
Match.groupdict(default=None)
返回一个字典,包含了所有的命名分组,key
就是组名。
default
参数同上。
如果分组未命名,则返回空字典
示例
m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Lebron James")
m.groupdict()
# out: {'first_name': 'Lebron', 'last_name': 'James'}
4、start 和 end
介绍
Match.start([group])
Match.end([group])
返回 group
匹配到的字串的开始和结束索引。
group
默认为 0
(意思是整个匹配的子串)。
如果 group
存在,但未匹配到,就返回 -1
。
示例
m = re.match(r"(\w+) (\w+)", "Lebron James, Kobe")
m.start(), m.end()
# out: (0, 12)
m.start(1), m.end(1)
# out: (0, 6)
m.start(2), m.end(2)
# out: (7, 12)
string = "Lebron James, Kobe"
m.group(1) == string[m.start(1): m.end(1)]
# out: True
5、span
介绍
Match.span([group])
对于一个匹配 m ,返回一个二元组 (m.start(group), m.end(group))
。
注意:如果 group
没有在这个匹配中,就返回 (-1, -1)
。
group
默认为 0
,就是整个匹配。
示例
m = re.match(r"(\w+) (\w+)", "Lebron James, Kobe")
m.span()
# out: (0, 12)
6、属性
Match.re
: 返回产生这个实例的正则表达式对象
Match.string
: 传递到 match()
或 search()
的字符串
m = re.match(r"(\w+) (\w+)", "Lebron James, Kobe")
m.string
# out: 'Lebron James, Kobe'
m.re
# out: re.compile(r'(\w+) (\w+)', re.UNICODE)
讲到这,我们就把下面要说的内容引出来了。
是的,没错,正是正则表达式对象
。
什么是正则表达式对象
?
正则表达式对象
正则表达式字符串经过编译后,就是正则表达式对象了。
通过 compile
方法编译将正则表达式的样式编译为一个正则表达式对象
如果需要多次使用这个正则表达式的话,用 re.compile()
保存这个正则对象以便复用,可以让程序更加高效。
re.compile(pattern, flags=0)
# pattern: 传入的正则样式
# flags: 指定匹配模式,如 re.MULTILINE 等
prog = re.compile(pattern)
result = prog.match(string)
# 等价于
result = re.match(pattern, string)
正则表达式对象支持以下方法和属性
1、search
介绍
Pattern.search(string[, pos[, endpos]])
扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象
如果没有匹配到,就返回 None
可选的第二个参数 pos
指定字符串中开始搜索的位置索引,默认为 0
可选参数 endpos 限定了字符串搜索的结束位置
p.search(string, pos, endpos)
等价于 p.search(string[pos:endpos], 0)
p = re.compile("dog")
m = p.search('a dog')
m.group()
# out: 'dog'
m = p.search('a dog', 3)
m # None
m = p.search('a dog', 2, 5)
m.group()
# out: 'dog'
2、match
介绍
Pattern.match(string[, pos[, endpos]])
如果从 string
的开始位置能够匹配到这个正则样式,就返回一个相应的匹配对象。
如果不匹配,就返回 None
可选参数 pos
和 endpos
与 search()
含义相同。
示例
p = re.compile("aaa")
m = p.match("hello aaa bbb")
m
# m is None
m = p.match("hello aaa bbb", 6)
m.group()
# out: 'aaa'
小结
其他正则对象
的方法与 re
模块的方法大同小异。
只是加了 pos
和 endpos
两个参数来限制搜索范围
就不在重复讲啦!
总结
Python
正则表达式讲到这,已经差不多都讲完了。
学完这些,应该多找几个例子自己练练手,加深印象。
建议可以从网上随便下一个网站的源码,然后用 re 模块从源码中提取相应的信息
再建议,想不到什么网站的话,可以下载豆瓣电影排行榜
网页源码,提取相应的电影信息
再再建议,前面的建议都动手做一下吧。
纸上得来终觉浅,绝知此事要躬行。
网友评论