数据采集与清洗基础习题(三)头歌参考答案(正则表达式)

数据采集习题参考答案,会持续更新,点个关注防丢失。

创作不易,一键三连给博主一个支持呗。

目录

实训九:Python正则表达式断言

第一关:先行断言

第一关答案

第二关:后发断言

第二关答案

实训十:python正则表达式标记 

实训十答案


实训九: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)

输出:

  1. ['n']
  2. []
  3. ['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)

输出:

  1. ['n']
  2. ['n']
  3. []

注意:反向断言不支持匹配不定长的表达式,也就是说+*字符不适用于反向断言的前后

第一关答案

import re

a = 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)

输出:

  1. []
  2. ['n']
  3. []

反向后发断言

(?负向后发断言 代表字符串中的一个位置,紧接该位置之的字符序列不能匹配pattern

a = re.findall('(?

输出:

  1. []
  2. []
  3. ['n']

从上面的描述可以看出,先行和后发的区别就是判断是否有<,正向与反向的区别是=。是不是非常容易记呢?

第二关答案

import re

a = input()

#*********** Begin **********#
result=re.findall(r'(?<=go)[\w]+',a)
#*********** End **********#
print(result)

实训十:python正则表达式标记 

正则表达式可以包含一些可选标记修饰符来控制匹配的模式。修饰符被指定为一个可选的标记。多个标记可以通过按位OR(|)来指定。如re.I | re.M 被设置成IM标志。

编程要求

请仔细阅读右侧代码,根据方法内的提示,在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)

输出:

  1. <_sre.SRE_Match object; span=(11, 16), match='APPLE'>
  2. <_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)

输出:

  1. <_sre.SRE_Match object; span=(0, 5),match='hello'>
  2. <_sre.SRE_Match object; span=(0, 12),match='hello\npython'>
  3. <_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)

输出:

  1. None
  2. <_sre.SRE_Match object; span=(4, 8), match='like'>

详细模式

re.VERBOSE标记(别名为re.X)允许复杂的正则表达式以更容易的方式表示。 该标记做两件事,首先,它会使所有的空白(除了字符组中)被忽略,包括换行符。其次,它将#字符(同样,除非在字符组内)当做注释字符。 示例:

a = re.search(r'(?P[\d]{3})-(?P[\d]{4})','867-5556')
b = re.search(r"""(?P[\d]{3})
- #匹配一个 - 连接符
(?P[\d]{4}) # 匹配四个数字
""",
'010-1234',re.X)
print(a)
print(b)

输出:

  1. <_sre.SRE_Match object; span=(0, 8), match='010-1234'>
  2. <_sre.SRE_Match object; span=(0, 8), match='010-1234'>

调试模式

re.DEBUG标记(没有别名)在编译正则表达式时将一些调试信息输出到 sys.stderr。 示例:

a = re.search(r'(?P[\d]{3})-(?P[\d]{4})','010-1234',re.DEBUG)
print(a)

输出:

  1. SUBPATTERN 1
  2. MAX_REPEAT 3 3
  3. IN
  4. CATEGORY CATEGORY_DIGIT
  5. LITERAL 45
  6. SUBPATTERN 2
  7. MAX_REPEAT 4 4
  8. IN
  9. CATEGORY CATEGORY_DIGIT
  10. <_sre.SRE_Match object; span=(0, 8), match='010-1234'>

使用多个标记

有时候我们可能需要同时使用多个标记,为了完成这点,可以使用|操作符。 示例: re.DOTALL|re.MULTILINEre.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

数据采集习题参考答案,会持续更新,点个关注防丢失。

创作不易,一键三连给博主一个支持呗。

你可能感兴趣的:(数据采集,Python,正则表达式,python)