数据采集习题参考答案,会持续更新,点个关注防丢失。
创作不易,一键三连给博主一个支持呗。
目录
实训九: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)
输出:
['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 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)
输出:
[]
['n']
[]
反向后发断言
(?负向后发断言 代表字符串中的一个位置,紧接该位置之前的字符序列不能匹配
pattern
。
a = re.findall('(?
输出:
[]
[]
['n']
从上面的描述可以看出,先行和后发的区别就是判断是否有<
,正向与反向的区别是=
和!
。是不是非常容易记呢?
import re
a = input()
#*********** Begin **********#
result=re.findall(r'(?<=go)[\w]+',a)
#*********** End **********#
print(result)
正则表达式可以包含一些可选标记修饰符来控制匹配的模式。修饰符被指定为一个可选的标记。多个标记可以通过按位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[\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)
输出:
<_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[\d]{3})-(?P[\d]{4})','010-1234',re.DEBUG)
print(a)
输出:
SUBPATTERN 1
MAX_REPEAT 3 3
IN
CATEGORY CATEGORY_DIGIT
LITERAL 45
SUBPATTERN 2
MAX_REPEAT 4 4
IN
CATEGORY 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
数据采集习题参考答案,会持续更新,点个关注防丢失。
创作不易,一键三连给博主一个支持呗。