数据采集习题参考答案,会持续更新,点个关注防丢失。
创作不易,一键三连给博主一个支持呗。为了方便查找,已按照头歌重新排版,朋友们按照头歌所属门类查找实训哦,该篇为Python正则表达式
文章目录
实训一:正则表达式入门
第一关:查找第一个匹配的字符串
第一关答案
第二关:基础正则表达式--字符组
第二关答案
第三关:基础正则表达式--区间与区间取反
第三关答案
第四关:基础正则表达式--快捷方式
第四关答案
第五关:字符串的开始与结束
第五关答案
第六关:任意字符
第六关答案
第七关:可选字符
第七关答案
第八关:重复区间
第八关答案
第九关:开闭区间与速写
第九关答案
实训二:Python正则表达式断言
第一关:先行断言
第一关答案
第二关:后发断言
第二关答案
实训三:Python正则表达式标记
实训三答案
实训一:正则表达式入门
第一关:查找第一个匹配的字符串
编程要求
请仔细阅读右侧代码,根据方法内的提示,在
Begin - End区域内进行代码补充具体任务如下:
导入相关包;
查看此信息是不是
张明的信息,查找结果存储在is_zhangming变量中。
相关知识
为了完成本关任务,你需要掌握:
- 如何在 python 中引入正则表达式库;
re库中search方法的使用。
1、在Python 中使用正则表达式
正可谓人生苦短,我用Python。Python有个特点就是库非常多,自然拥有正则匹配这种常见的库,并且此库已经嵌入在Python标准库中,使用起来非常方便,只需要在代码中导入re模块即可。
import re
Python的re模块,使得Python具备了使用全部正则表达式的功能。为了让我们灵活的使用正则表达式,现在咱们的任务就是学习正则在re库中的使用。
2、最基础正则表达式
正则表达式是一个以简单直观的方式通过寻找模式匹配文本的工具。 听起来比较复杂,实际非常简单,下面开始体验最简单的正则表达式。最简单的正则表达式是些仅包含简单字母数字字符的表达式——不包含任何其他字符,在这种情况下正则表达式完完全全就是一个正常的字符串。
举例说明,我们要匹配张明,那么张明这两个字符就是我们需要的正则表达式。
3、正则匹配函数
知道了最基础正则表达式,可是如何在python中使用了?首先我们学习第一个函数,search()函数,它的目的是接收一个正则表达式和一个字符串,并返回发现的第一个匹配的字符串。
import rea = re.search(r'fox','the quick brown fox jumpred') #第一个参数为正则表达式,第二个参数为要处理的字符串
print(a.span()) # span方法获取的是正则表达式匹配到的位置b = re.search(r'www','the quick brown fox jumpred')
print(b) #如果匹配不到则会返回None
输出如下:
(16, 19)None
如何匹配到了,我们输出他在正则表达式中的位置,如果没有匹配到,则输出为空。
第一关答案
# coding=utf-8# 在此导入python正则库
########## Begin ##########
import re########## End ##########check_name = input()
# 在此使用正则匹配'张明'的信息,结果存储到is_zhangming中
########## Begin ##########is_zhangming=re.search(r'张明',check_name)########## End ##########if is_zhangming is not None:print(is_zhangming.span())
else:print(is_zhangming)
第二关:基础正则表达式--字符组
编程要求
请仔细阅读右侧代码,根据方法内的提示,在
Begin - End区域内进行代码补充具体任务如下:
- 从文本中快速匹配到
python和Python的小程序,输出匹配到的所有内容。
相关知识
为了完成本关任务,你需要掌握:
1.正则表达式的字符组的表达方式;
2.
Python中re模块中获取多个匹配的使用方法。
在上一个任务中,已经了解了只包含简单字母数字的正则表达式,但如果仅仅如此,那么太小瞧正则表达式的威力了。正则表达式强大的地方在于能够指定用于匹配的文本模式。本关来学习正则表达式的字符组匹配。
1、获得多个匹配信息
在很多常见的场景中需要进行多个匹配,比如在学生名单中过滤出所有的张姓学生的个数。
如果有这种需求咱们可以使用re模块中的findall 或者 finditer方法。两个方法的区别在于 findall 返回的是一个列表,finditer返回的是一个生成器。
l = re.findall(r'张','张三 张三丰 张无忌 张小凡')
print(l)
['张', '张', '张', '张']
在这个例子中,我们会发现findall返回了4个“张”,这是因为“张”字在后面的字符串中出现了4次。即findall返回了所有的匹配信息。
2、字符组
字符组允许匹配一组可能出现的字符,在正则表达式中用[]表示字符组标志,举个例子。
'I like Python3 and I like python2.7 '
在这句话中,既有大写的Python,又有全部是小写的python。如果我要求都匹配出来,这时候该怎么操作了?这就是正则匹配中字符组的威力了。下面看下示例。
a = re.findall(r'[Pp]ython','I like Python3 and I like python2.7 ')
print(a)
输出结果:['Python', 'python']
可以发现[Pp]既可以匹配大写的P也可以匹配小写的p,这里值的我们注意的是[Pp]仅匹配一个字符,他表示匹配在这个[]内的某一个。
第二关答案
# coding=utf-8import reinput_str = input()# 编写获取python和Python的正则,并存储到match_python变量中########## Begin ##########
match_python=re.findall(r'[Pp]ython',input_str)########## End ##########print(match_python)
第三关:基础正则表达式--区间与区间取反
编程要求
请仔细阅读右侧代码,根据方法内的提示,在
Begin - End区域内进行代码补充具体任务如下:
匹配数字字符信息;
匹配不是数字字符的信息。
相关知识
为了完成本关任务,你需要掌握:
1.正则表达式区间的表达方式;
2.正则表达式区间取反的表达方式。
本关来学习正则表达式区间与区间取反的相关知识。
1.区间
有一些常见的字符组非常大,比如,我们要匹配的是任意数字,如果依照上述代码,每次我们都需要使用[0123456789] 这种方式明显很不明智,而如果要匹配从a-z的字母,我们也这样编写代码的话,肯定会让我们崩溃。
为了适应这一点,正则表达式引擎在字符组中使用连字符(-)代表区间,所以我们匹配任意数字可以使用[0-9],所以如果我们想要匹配所有小写字母,可以写成[a-z],想要匹配所有大写字母可以写成[A-Z]。
可能我们还有个需求:匹配连字符。因为-会被正则表达式引擎理解为代表连接区间,所以这个时候我们需要对-进行转义。
示例:
a = re.findall(r'[0-9]','xxx007abc')
b = re.findall(r'[a-z]','abc001ABC')
c = re.findall(r'[A-Za-z0-9]','abc007ABC')
d = re.findall(r'[0-9\-]','0edu 007-edu')
print(a)
print(b)
print(c)
print(d)
执行结果如下:
['0', '0', '7']['a', 'b', 'c']['a', 'b', 'c', '0', '0', '7', 'A', 'B', 'C']['0', '0', '0', '7', '-']
2.区间取反
到目前为止,我们定义的字符组都是由可能出现的字符定义,不过有时候我们可能希望根据不会出现的字符定义字符组,例如:匹配不包含数字的字符组。
a = re.findall(r'[^0-9]','xxx007abc')
b = re.search(r'[^0-9]','xxx007abc')
print(a)
print(b)
执行结果如下:
['x', 'x', 'x', 'a', 'b', 'c']<re.Match object; span=(0, 1), match='x'>
可以通过在字符数组开头使用 ^ 字符实现取反操作,从而可以反转一个字符组(意味着会匹配任何指定字符之外的所有字符)。
接下来再看一个表达式:n[^e] 这意味着字符n接下来的字符是除了e之外所有的字符。
a = re.findall(r'n[^e]','final')
b = re.search(r'n[^e]','final')
c = re.findall('r[n[^e]]','Python')
print(a)
print(b)
print(c)
执行结果如下:
['na']<re.Match object; span=(2, 4), match='na'>[]
这里我们可以发现a和b匹配的是na,字符a因为不是e所以可以被匹配,而变量c的值为空,在这里正则表达式引擎只匹配到了字符串n的位置,而n之后没有任何可以匹配[^e]的字符了,所以这里也匹配失败。
第三关答案
# coding=utf-8import reinput_str = input()# 1、编写获取到数字的正则,并输出匹配到的信息
########## Begin ##########
a=re.findall(r'[0-9]',input_str)
print(a)
########## End ########### 2、编写获取到不是数字的正则,并输出匹配到的信息
########## Begin ##########
b=re.findall(r'[^0-9]',input_str)
print(b)
########## End ##########
第四关:基础正则表达式--快捷方式
编程要求
请仔细阅读右侧代码,根据方法内的提示,在
Begin - End区域内进行代码补充具体任务如下:
- 匹配单词字符,并输出;
- 匹配不是单词的字符,并输出。
相关知识
为了完成本关任务,你需要掌握:
1.正则表达式快捷方式的表达方式;
2.正则表达式快捷方式取反的表达方式;
本关来学习正则表达式的快捷方式与快捷方式取反。
快捷方式
在正则表达式的使用过程中,人们为了快捷表达与方便阅读,提取了几种普通字符组,并在正则表达式引擎中预定义了其快捷方式。如果我们想要定义单词,以目前学到的可能会使用[A-Za-z],但是,很多单词都是使用该字母以外的字符。比如中文,以及其他语言。
正则表达式引擎提供了一些快捷方式:
| 快捷方式 | 描述 |
|---|---|
| \w | 与任意单词匹配 |
| \d | 与任意数字匹配 |
| \s | 匹配空白字符,比如空格,换行等 |
| \b | 匹配一个长度为0的子串 |
示例1
a = re.findall(r'\w','学好Python 大展拳脚')
b = re.search(r'\w','python3')
c = re.search(r'\d','编号89757')
print(a)
print(b)
print(c)
执行结果输出如下:
['学', '好', 'P', 'y', 't', 'h', 'o', 'n', '大', '展', '拳', '脚']<re.Match object; span=(0, 1), match='p'><re.Match object; span=(2, 3), match='8'>注:这里
findall会返回所有能匹配的值,search只会返回第一个匹配到的值。
快捷方式取反
之前提到了取反,快捷方式也可以取反, 例如对于 \w的取反为\W,可以发现将小写改写成大写即可。
注意:这里
\B有所不同,\b匹配的是在单词开始或结束位置长度为0的子字符串,而\B匹配不在单词开始和结束位置的长度为0的子字符串。
a = re.findall(r'\Bmaster\B','masterxiao master xxx master abc') #单词字符后面或前面不与另一个单词字符直接相邻
b = re.search(r'master\B','masterxiao')print(a)
print(b)
执行结果输出如下:
[]<re.Match object; span=(0, 6), match='master'>
第四关答案
# coding=utf-8import reinput_str = input()# 1、编写获取到单词的正则,并输出匹配到的信息
########## Begin ##########
a=re.findall(r'\w',input_str)
print(a)########## End ########### 2、编写获取到不是单词的正则,并输出匹配到的信息
########## Begin ##########
b=re.findall(r'\W',input_str)
print(b)########## End ##########
第五关:字符串的开始与结束
任务描述
本关任务:使用正则表达式的方法编写一个小程序。该程序可以: 1、匹配到该字符串是否以
educoder开头,并输出该字符串的位置; 2、匹配到该字符串是否以educoder结尾,并输出该字符串的位置。
相关知识
为了完成本关任务,你需要掌握: 1.正则表达式字符串开始的使用方法; 2.正则表达式字符串结束的使用方法。
字符串的开始和结束
在日常生活中,一个事情的开始与结束都是一件比较重要的事情,在字符串匹配的过程中也是如此,字符串的开始与结束式一个重要的特征。比如我们要获取判断字符串是否以python开头,是否以python结尾。
对于这种情况,之前匹配方法就有点不够用了,因此在正则表达式中 用^ 可以表示开始,用 $表示结束,示例如下:
a = re.search(r'^python', 'python is easy')
b = re.search(r'python$', 'python is easy')
c = re.search(r'^python', 'i love python')
d = re.search(r'python$', 'i love python')
print(a.span())
print(b)
print(c)
print(d.span())
执行输出结果如下:
(0, 6)NoneNone(7, 13)
可以发现,在上述例子中,python is easy和i love python都存在python字符串,但是一个在开头一个在结尾,因此变量a和变量d都匹配到了信息。其他则无法匹配到信息。
第五关答案
# coding=utf-8import reinput_str = input()# 1、编写获取到以educoder开头的正则,并存储到变量a
########## Begin ##########
a=re.search(r'^educoder',input_str)########## End ##########
if a is not None:print(a.span())
else:print(a)# 2、编写获取到以educoder结束的正则,并存储到变量b
########## Begin ##########
b=re.search(r'educoder$',input_str)########## End ##########
if b is not None:print(b.span())
else:print(b)
第六关:任意字符
编程要求
请仔细阅读右侧代码,根据方法内的提示,在
Begin - End区域内进行代码补充具体任务如下:
- 匹配出测试集中的包含
(任意字符)ython的子字符串,并输出数组子字符串。
相关知识
为了完成本关任务,你需要掌握:
- 正则表达式通配符的使用;
python正则表达式编程。
通配符
在生活中我们经常会有这么一种场景,我们记得某个人名为孙x者,就是不记得他叫孙行者,在正则表达式中针对此类场景,产生了通配符的概念,用符号.表示。它代表匹配任何单个字符,不过值得注意的是,它只能出现在方括号字符组以外。
值得注意的是:.字符只有一个不能匹配的字符,也就是换行(\n),不过让.字符与换行符匹配也是可能的,以后会讨论。示例如下:
a = re.findall(r'p.th.n','hello python re')
b = re.findall(r'p.....','学好 python 人见人爱')print(a)
print(b)
输出:
['python']
['python']
第六关答案
# coding=utf-8import reinput_str = input()# 编写获取(任意字符)+ython的字符串,并存储到变量a中
########## Begin ##########
a=re.findall(r'.ython',input_str)########## End ##########
print(a)
第七关:可选字符
任务描述
请仔细阅读右侧代码,根据方法内的提示,在
Begin - End区域内进行代码补充,具体任务如下:
- 匹配出字符串中的
she或者he,并输出匹配到的信息。
相关知识
为了完成本关任务,你需要掌握:
1.正则表达式可选字符的使用方法;
2.
python正则表达式编程。
到目前为止,我们看到的正则表达式都是在正则表达式中的字符与被搜索的字符串中的字符保持1:1的关系。不过有时,我们可能想要匹配一个单词的不同写法,比如color和colour,或者honor与honour。这个时候我们可以使用 ? 符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次。
a = re.search(r'honou?r','He Served with honor and distinction')
b = re.search(r'honou?r','He Served with honour and distinction')
c = re.search(r'honou?r','He Served with honou and distinction')
print(a)
print(b)
print(c)
执行结果输出如下:
<re.Match object; span=(15, 20), match='honor'><re.Match object; span=(15, 21), match='honour'>None
可以发现,在上述三个例子中,正则表达式为honou?r,这里可以匹配的是 honor 和 honour 不能匹配 honou,可以知道的是 ? 确定了前一个u是可选的。在第一个示例中,没有u,是没有问题可以匹配的;在第二个示例中,u存在这也没有问题;在第三个例子中,u存在但是r不存在,这样就不能匹配了。
第七关答案
# coding=utf-8import reinput_str = input()# 编写获取she或者he的字符串,并存储到变量a中
########## Begin ##########
a=re.findall(r's?he',input_str)########## End ##########
print(a)
第八关:重复区间
任务描述
请仔细阅读右侧代码,根据方法内的提示,在
Begin - End区域内进行代码补充,匹配并输出符合如下要求的字符串:1、字符串中重复
2个数字的子字符串;2、重复
4-7个数字组成的子字符串。
相关知识
为了完成本关任务,你需要掌握:
1.正则表达式重复区间的表达方法;
2.
Python正则编程。
在正则表达式在一个字符组后加上{N} 就可以表示 {N} 之前的字符组出现N次。举个例子:
a = re.findall(r'[\d]{4}-[\d]{7}','张三:0731-8825951,李四:0733-8794561')
print(a)
输出为:
['0731-8825951', '0733-8794561']
可能有时候,我们不知道具体匹配字符组要重复的次数,比如身份证有15位也有18位的。
这里重复区间就可以出场了,语法:{M,N},M是下界而N是上界。
举个例子:
a = re.search(r'[\d]{3,4}','0731')
b = re.search(r'[\d]{3,4}','073')print(a)
print(b)
执行结果输出如下:
<re.Match object; span=(0, 4), match='0731'>
<re.Match object; span=(0, 3), match='073'>
第八关答案
# coding=utf-8import reinput_str = input()
# 1、基于贪心模式匹配字符串中重复出现2个数字的子字符串,并存储到变量a。########## Begin ##########
a=re.findall(r'[\d]{2}',input_str)########## End ##########
print(a)# 2、基于贪心模式匹配字符串中重复出现4-7个数字的子字符串,并存储到变量b。
########## Begin ##########
b=re.findall(r'[\d]{4,7}',input_str)########## End ##########
print(b)
第九关:开闭区间与速写
任务描述
请仔细阅读右侧代码,根据方法内的提示,在
Begin - End区域内进行代码补充,匹配并输出符合如下要求的字符串:
重复数字
5次及以上的子字符串;重复数字
1次及以上的子字符串。
相关知识
1.正则表达式重复基本知识;
2.正则表达式开闭区间的基本知识;
3.正则表达式重复速写的方法。
| 符号 | 含义 |
|---|---|
| ‘+’ | 重复匹配1个或多个 |
| ‘*’ | 重复匹配0个或多个 |
符号+用来表示重复一次到无数次,如下示范:
a = re.findall(r'[\d]+','0731-8859456')
print(a)
输出结果:
['0731', '8859456']
符号'*'用来表示重复 0次到无数次,如下示范:
a = re.findall(r'[\d]*','0731-8859456')
print(a)
输出结果:
['0731', '', '8859456', '']
第九关答案
# coding=utf-8import reinput_str = input()
# 1、基于贪心模式匹配字符串中连续出现5个数字以上的子字符串,并存储到变量a。########## Begin ##########
a=re.findall(r'[\d]{5,}',input_str)########## End ##########
print(a)# 2、匹配字符串中都为数字的子字符串,并存储到变量b。
########## Begin ##########b=re.findall(r'[\d]+',input_str)
########## End ##########
print(b)
实训二:Python正则表达式断言
第一关:先行断言
编程要求
请根据相关知识补充右侧
Begin-End之间的代码,并完成下列任务:
- 使用正向先行断言获取字符串中以
ing结尾的字符(不能为空)。
相关知识
先行断言分为正向先行断言和反向先行断言,完成本关任务需要了解这两个知识点。
正向先行断言
(?=pattern)表示正向先行断言,整个括号里的内容(包括括号本身)代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配pattern。举个例子:
# `(?!e)`代表字符串中的一个位置,紧接该位置之后的字符序列只能够匹配`e`。
a = re.findall(r'n(?=al)','final')
b = re.findall(r'n(?=e)','python')
c = re.findall(r'n(?=e)','jasmine')print(a)
print(b)
print(c)
输出:
['n'][]['n']
反向先行断言
(?!pattern)表示反向先行断言,与正向先行断言相反,紧接该位置之后的字符序列不能够匹配pattern。同样举个例子:
a = re.findall(r'n(?!e)','final')
b = re.findall(r'n(?!e)','python')
c = re.findall(r'n(?!e)','next')print(a)
print(b)
print(c)
输出:
['n']['n'][]
注意:反向断言不支持匹配不定长的表达式,也就是说+、*字符不适用于反向断言的前后。
第一关答案
import rea = input()#*********** Begin **********#
result=re.findall(r'[\w]+(?=ing)',a)
#*********** End **********#
print(result)
第二关:后发断言
编程要求
请根据相关知识补充右侧
Begin-End之间的代码,并完成下列任务:
- 使用正向后发断言匹配字符串中以
go开头的字符的后半部分。
相关知识
后行断言分为正向后发断言和反向后发断言,完成本关需要掌握这两个知识点。
正向后发断言
(?<=pattern)正向后发断言代表字符串中的一个位置,紧接该位置之前的字符序列只能够匹配pattern。
a = re.findall('(?<=a)n','final')
b = re.findall('(?<=a)n','command')
c = re.findall('(?<=i)n','negative')print(a)
print(b)
print(c)
输出:
[]['n'][]
反向后发断言
(?<!pattern)负向后发断言 代表字符串中的一个位置,紧接该位置之前的字符序列不能匹配pattern。
a = re.findall('(?<!i)n','final')
b = re.findall('(?<!a)n','command')
c = re.findall('(?<!i)n','negative')print(a)
print(b)
print(c)
输出:
[][]['n']
从上面的描述可以看出,先行和后发的区别就是判断是否有<,正向与反向的区别是=和!。是不是非常容易记呢?
第二关答案
import rea = input()#*********** Begin **********#
result=re.findall(r'(?<=go)[\w]+',a)
#*********** End **********#
print(result)
实训三:Python正则表达式标记
正则表达式可以包含一些可选标记修饰符来控制匹配的模式。修饰符被指定为一个可选的标记。多个标记可以通过按位OR(|)来指定。如re.I | re.M 被设置成I和M标志。
编程要求
请仔细阅读右侧代码,根据方法内的提示,在
Begin - End区域内进行代码补充具体任务如下:
- 匹配出以
study开头的邮箱,不区分大小写。
相关知识
为了完成本关任务,你需要掌握:
1.
Python正则表达式基本用法;2.
Python正则表达式标记。
不区分大小写
re.IGNORECASE也可以简写为re.I,使用该标记,可以使正则表达式变为不区分大小写。 示例:
a = re.search(r'apple',"THIS IS AN APPLE",re.IGNORECASE)
b = re.search(r'apple','THIS IS AN APPLE',re.I)
print(a)
print(b)
输出:
<_sre.SRE_Match object; span=(11, 16), match='APPLE'><_sre.SRE_Match object; span=(11, 16), match='APPLE'>
点匹配换行符
re.DOTALL标记(别名为re.S)可以让.字符除了匹配其他字符之外,还匹配换行符。 示例:
a = re.search(r'.+','hello\npython')
b = re.search(r'.+','hello\npython',re.S)
c = re.search(r'.+','hello\npython',re.DOTALL)
print(a)
print(b)
print(c)
输出:
<_sre.SRE_Match object; span=(0, 5),match='hello'><_sre.SRE_Match object; span=(0, 12),match='hello\npython'><_sre.SRE_Match object; span=(0, 12),match='hello\npython'>
多行模式
re.MULTILINE标记(别名为re.M)可以匹配多行,使用该标记可以使得仅能够匹配字符串开始与结束的^与$字符可以匹配字符串内任意行的开始与结束。
a = re.search(r'^like','foo\nlike')
b = re.search(r'^like','foo\nlike',re.M)
print(a)
print(b)
输出:
None<_sre.SRE_Match object; span=(4, 8), match='like'>
详细模式
re.VERBOSE标记(别名为re.X)允许复杂的正则表达式以更容易的方式表示。 该标记做两件事,首先,它会使所有的空白(除了字符组中)被忽略,包括换行符。其次,它将#字符(同样,除非在字符组内)当做注释字符。 示例:
a = re.search(r'(?P<first>[\d]{3})-(?P<second>[\d]{4})','867-5556')
b = re.search(r"""(?P<first>[\d]{3})
- #匹配一个 - 连接符
(?P<second>[\d]{4}) # 匹配四个数字
""",
'010-1234',re.X)
print(a)
print(b)
输出:
<_sre.SRE_Match object; span=(0, 8), match='010-1234'><_sre.SRE_Match object; span=(0, 8), match='010-1234'>
调试模式
re.DEBUG标记(没有别名)在编译正则表达式时将一些调试信息输出到 sys.stderr。 示例:
a = re.search(r'(?P<first>[\d]{3})-(?P<second>[\d]{4})','010-1234',re.DEBUG)
print(a)
输出:
SUBPATTERN 1MAX_REPEAT 3 3INCATEGORY CATEGORY_DIGITLITERAL 45SUBPATTERN 2MAX_REPEAT 4 4INCATEGORY CATEGORY_DIGIT<_sre.SRE_Match object; span=(0, 8), match='010-1234'>
使用多个标记
有时候我们可能需要同时使用多个标记,为了完成这点,可以使用|操作符。 示例: re.DOTALL|re.MULTILINE 或 re.S | re.M 。
实训三答案
import re
def re_mark(input_data):result=[]#*********** Begin **********#result = re.findall(r'^study[\w]*@[\w]+\.com',input_data,re.I|re.M)#*********** End **********#return result
数据采集习题参考答案,会持续更新,点个关注防丢失。
创作不易,一键三连给博主一个支持呗。