发布时间: 2018-09-01 18:42:51
8.1 实验介绍
8.1.1 关于本实验
本实验主要介绍了 Python 正则表达式的相关知识点和简单操作。
8.1.2 实验目的
1.理解 Python 正则表达式的含义。
2.掌握和 Python 正则表达式的基本操作。
8.2 实验任务配置
8.2.1 概念知识
Python 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python 自 1.5 版本起增加了 re 模块,它提供 Perl 风格的正则表达式模式。
re 模块使 Python 语言拥有全部的正则表达式功能。
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
本章节主要介绍 Python 中常用的正则表达式处理函数。
8.2.2 实验内容
步骤 1 re.match 函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。
函数语法:
re.match(pattern, string, flags=0)
实例:
>>> import re
>>> print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
>>> print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配输出结果:
(0, 3)
None
步骤 2 re.search 方法
re.search 扫描整个字符串并返回第一个成功的匹配。函数语法:
re.search(pattern, string, flags=0)
实例:
>>> import re
>>> line = "Cats are smarter than dogs"
>>> searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
>>> if searchObj:
>>> print("searchObj.group() : ", searchObj.group())
>>> print("searchObj.group(1) : ", searchObj.group(1))
>>> print("searchObj.group(2) : ", searchObj.group(2))
>>> else:
>>> print("Nothing found!!" )
以上实例执行结果如下:
searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats
searchObj.group(2) : smarter
步骤 3 re.match 与 re.search 的区别
re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回
None;而 re.search 匹配整个字符串,直到找到一个匹配。
>>> import re
>>> line = "Cats are smarter than dogs";
>>> matchObj = re.match( r'dogs', line, re.M|re.I)
>>> if matchObj:
>>> print("match --> matchObj.group() : ", matchObj.group())
>>> else:
>>> print("No match!!")
>>> matchObj = re.search( r'dogs', line, re.M|re.I)
>>> if matchObj:
>>> print("search --> matchObj.group() : ", matchObj.group())
>>> else:
>>> print("No match!!")
以上实例运行结果如下:
No match!!
search --> matchObj.group() : dogs
步骤 4 检索和替换
Python 的 re 模块提供了 re.sub 用于替换字符串中的匹配项。语法:
re.sub(pattern, repl, string, count=0, flags=0)
>>> import re
>>> phone = "2004-959-559 # 这是一个国外电话号码"
# 删除字符串中的 Python 注释
>>> num = re.sub(r'#.*$', "", phone)
>>> print("电话号码是: ", num)
# 删除非数字(-)的字符串
>>> num = re.sub(r'\D', "", phone)
>>> print("电话号码是 : ", num)
结果如下:
电话号码是: 2004-959-559
电话号码是 : 2004959559
步骤 5 re.compile 函 数
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和
search() 这两个函数使用。
语法格式为:
re.compile(pattern[, flags])
>>>import re
>>> pattern = re.compile(r'\d+') # 用于匹配至少一个数字
>>> m = pattern.match('one12twothree34four') # 查找头部,没有匹配
>>> print(m) None
>>> m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配
>>> print(m)
None
>>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配
>>> print(m) # 返回一个 Match 对象
<_sre.SRE_Match object at 0x10a42aac0>
>>> m.group(0) # 可省略 0
'12'
>>> m.start(0) # 可 省 略 0
3
>>> m.end(0) # 可 省 略 0
5
>>> m.span(0) # 可 省 略 0
(3, 5)
步骤 6 findall
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。语法格式为:
findall(string[, pos[, endpos]])
>>> import re
>>> pattern = re.compile(r'\d+') # 查找数字
>>> result1 = pattern.findall('runoob 123 google 456')
>>> result2 = pattern.findall('run88oob123google456', 0, 10)
>>> print(result1)
>>> print(result2)
输出结果:
['123', '456']
['88', '12']
步骤 7 re.finditer
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
re.finditer(pattern, string, flags=0)
>>> import re
>>> it = re.finditer(r"\d+","12a32bc43jf3")
>>> for match in it:
>>> print(match.group())
输出结果:
12
32
43
3
步骤 8 re.split
split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:
re.split(pattern, string[, maxsplit=0, flags=0])
实例:
>>>import re
>>> re.split('\W+', 'runoob, runoob, runoob.') ['runoob', 'runoob', 'runoob', '']
>>> re.split('(\W+)', ' runoob, runoob, runoob.')
['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
>>> re.split('\W+', ' runoob, runoob, runoob.', 1)
['', 'runoob, runoob, runoob.']
>>> re.split('a*', 'hello world') # 对于找不到匹配的字符串而言,split 不会对其作分割
['hello world']
上一篇: {MyBatis}操作数据库
下一篇: {HTML5}基础核心-第二节-上