Python使用正则表达式
目录
- 钳制芝士
- 第1关:查找第一个匹配的字符串
- 第2关:基础正则表达式–字符组
- 第3关:基础正则表达式–区间与区间取反
- 第4关:基础正则表达式–快捷方式
- 第5关:字符串的开始与结束
- 第6关:任意字符
- 第7关:可选字符
- 第8关:重复区间
- 第9关:开闭区间与速写
钳制芝士
使用 pattern 去匹配
re.match
尝试从字符串的起始位置匹配一个模式(是个元组)
re.search
扫描整个字符串并返回第一个成功的匹配的位置(是个元组)
他们有差不多相同的格式:
re.match(pattern, string, flags=0)
re.search(pattern, string, flags=0)
获取匹配表达式
- 在使用了search或者match之后,使用 group(num) 或 groups()
其中:
- group() 可以输入多个组号
- groups() 返回所有
- 使用find、find_all函数
这个东西和爬虫里面的内容有点像,但是返回的数据类型是不一样的。
它们返回的,应该是元组(未证实)。
检索和替换
re.sub用于替换字符串中的匹配
re.sub(pattern, repl, string, count=0, flags=0)
第1关:查找第一个匹配的字符串
解题思路
# coding=utf-8
# todo 在此导入python正则库
import re
check_name = input()
# todo 在此使用正则匹配'张明'的信息,结果存储到is_zhangming中
expr = re.compile(r'\b张明\b')
is_zhangming = re.search(expr,check_name)
if is_zhangming is not None:
print(is_zhangming.span())
else:
print(is_zhangming)
第2关:基础正则表达式–字符组
编程要求
根据提示,在右侧编辑器 Begin-End 部分补充代码,具体任务如下:
从文本中快速匹配到 python 和 Python 的小程序,输出匹配到的所有内容。
测试说明
测试输入:
I LIKE Python3 and i like python2.7;
预期输出:
[Python, python]
解题思路
# coding=utf-8
import re
input_str = input()
# todo 编写获取python和Python的正则,并存储到 match_python 变量中
match_python = re.findall(r'python|Python',input_str)
print(match_python)
第3关:基础正则表达式–区间与区间取反
编程要求
请仔细阅读右侧代码,根据提示,在右侧编辑器 Begin-End 部分补充代码,具体任务如下:
- 匹配数字字符信息;
- 匹配不是数字字符的信息。
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
测试输入:Python3 and python2.7;
预期输出:
['3', '2', '7']
['P', 'y', 't', 'h', 'o', 'n', ' ', 'a', 'n', 'd', ' ', 'p', 'y', 't', 'h', 'o', 'n', '.']
解题思路
# coding=utf-8
import re
input_str = input()
# todo 1、编写获取到数字的正则,并输出匹配到的信息
mat = re.findall(r"\d",input_str)
print(mat)
# todo 2、编写获取到不是数字的正则,并输出匹配到的信息
mat = re.findall(r"[^\d]",input_str)
print(mat)
第4关:基础正则表达式–快捷方式
编程要求
请仔细阅读右侧代码,根据提示,在右侧编辑器 Begin-End 部分补充代码,具体任务如下:
- 匹配单词字符,并输出;
- 匹配不是单词的字符,并输出。
测试说明
测试输入:Python3 and python2.7
;
预期输出:
['P', 'y', 't', 'h', 'o', 'n', '3', 'a', 'n', 'd', 'p', 'y', 't', 'h', 'o', 'n', '2', '7']
[' ', ' ', '.']
解题思路
# coding=utf-8
import re
input_str = input()
# 1、编写获取到单词的正则,并输出匹配到的信息
s = re.findall(r"\w",input_str)
print(s)
# 2、编写获取到不是单词的正则,并输出匹配到的信息
s = re.findall(r"\W",input_str)
print(s)
第5关:字符串的开始与结束
编程要求
请仔细阅读右侧代码,根据提示,在右侧编辑器 Begin-End 部分补充代码,具体任务如下:
- 匹配以 educoder 开头的字符串,并存储到变量 a;
- 匹配以 educoder 结束的字符串,并存储到变量 b。
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
测试输入:educoder can help you
;
预期输出:
(0, 8)
None
测试输入:i love educoder
;
预期输出:
None
(7, 15)
测试输入:you can make educoder better
预期输出:
None
None
解题思路
# coding=utf-8
import re
# 必须要记得这个引用模块
# a = search(r'^educoder',input_str)
# NameError: name 'search' is not defined
input_str = input()
# todo 1、编写获取到以educoder开头的正则,并存储到变量a
a = re.search(r'^educoder',input_str)
if a is not None:
print(a.span())
else:
print(a)
# todo 2、编写获取到以educoder结束的正则,并存储到变量b
b = re.search(r'educoder$',input_str)
if b is not None:
print(b.span())
else:
print(b)
第6关:任意字符
编程要求
请仔细阅读右侧代码,根据提示,在右侧编辑器 Begin-End 部分补充代码,具体任务如下:
- 匹配出测试集中的包含 (任意字符)ython 的子字符串,并输出数组子字符串。
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
测试输入:2ython
;
预期输出:['2ython']
。
测试输入:ython
;
预期输出:[]
。
解题思路
# coding=utf-8
import re
input_str = input()
# todo: 编写获取(任意字符)+ython的字符串,并存储到变量a中
a = re.findall(r'.ython',input_str)
########## End ##########
print(a)
第7关:可选字符
编程要求
请仔细阅读右侧代码,根据提示,在右侧编辑器 Begin-End 部分补充代码。具体任务如下:
- 匹配出字符串中的 she 或者 he ,并输出匹配到的信息。
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
测试输入:she is
;
预期输出:she
。
测试输入:he;
;
预期输出:he
。
解题思路
# coding=utf-8
import re
input_str = input()
# 编写获取she或者he的字符串,并存储到变量a中
# a = re.findall(r'?he',input_str)
# Traceback (most recent call last):
# File "step5/student_step_5.py", line 8, in <module>
# a = re.findall(r'?he',input_str)
# sre_constants.error: nothing to repeat at position 0
a = re.findall(r's?he',input_str)
print(a)
第8关:重复区间
编程要求
请仔细阅读右侧代码,根据提示,在右侧编辑器 Begin-End 部分补充代码。匹配并输出符合如下要求的字符串:
- 字符串中重复 2 个数字的子字符串;
- 重复 4-7 个数字组成的子字符串。
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
测试输入:张3:0731-8825951
,李4:0733-8794561
;
预期输出:['0731', '8825951', '0733', '8794561']
。
解题思路
# coding=utf-8
import re
input_str = input()
# 1、基于贪心模式匹配字符串中重复出现2个数字的子字符串,并存储到变量a。
a = re.findall(r"\d{2}",input_str)
print(a)
# 2、基于贪心模式匹配字符串中重复出现4-7个数字的子字符串,并存储到变量b。
# a = re.findall(r"\d{4,7}",input_str)
# NameError: name 'b' is not defined
b = re.findall(r"\d{4,7}",input_str)
print(b)
第9关:开闭区间与速写
编程要求
请仔细阅读右侧代码,根据提示,在右侧编辑器 Begin-End 部分补充代码,匹配并输出符合如下要求的字符串:
- 重复数字 5 次及以上的子字符串;
- 重复数字 1 次及以上的子字符串。
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
测试输入:0731-8859456
;
预期输出:
['8859456']
['0731', '8859456']
解题思路
# coding=utf-8
import re
input_str = input()
# todo 1、基于贪心模式匹配字符串中连续出现5个数字以上的子字符串,并存储到变量a。
a = re.findall(r"\d{5,}",input_str)
print(a)
# todo 2、匹配字符串中都为数字的子字符串,并存储到变量b。
# b = re.findall(r"\d*",input_str).remove("")
# 这种写法就完全不行,不知道为什么
# ouput:
# None
# 而这种方式就可以
# tmp = re.findall(r"\d*",input_str)
# print(tmp)
# while "" in tmp:
# tmp.remove("")
# 这种就差一个
# output ['123456', '789', '']
# tmp = re.findall(r"\d*",input_str)
# tmp.remove("")
#
b = re.findall(r"\d+",input_str)
print(b)