Coding for KidsCoding for Kids
创意关卡挑战教师指南
为功能投票
高级 Python 开发课程
第 章
>
第 级

字符串与时间模块
正则模块

目标

使用正则表达式验证和整理与员工及分区分配有关的文件。

在邻近的办公室中,有一些文档需要更新,内容涉及新农田上开始工作的员工以及照料作物和家畜的分区。管理文件可能会十分棘手,尤其是在处理大量字符串文本时。为此,我们将使用 re 模块,它是正则表达式(Regular Expressions)的缩写,也称为 Regex。我们可以通过 import re 来访问其函数,就本级别而言,我们将使用以下函数:

  • re.findall(): 返回一个包含字符串中所有出现项的列表。它接受两个参数,第一个参数是你希望在字符串中查找的字符,第二个参数是要搜索的字符串。
  • re.sub(): 将指定出现的部分替换为另一字符串。它接受三个参数,第一个参数是你想替换的字符,第二个参数是替换成的字符,第三个参数是你希望搜索的字符串。
  • re.search(): 找出某项在字符串中的位置,返回一个对象。它接受两个参数,分别为你搜索的字符和要搜索的字符串。你可以使用该对象的其他方法,例如 span(),它返回搜索项在文本中起始和结束位置的元组。
  • re.split(): 按指定间隔将字符串拆分为列表。它接受两个参数,第一个参数是拆分字符串的模式,第二个参数是你希望拆分的字符串。
  • re.match(): 检查字符串开头是否包含某个值。它类似于简化版的 re.search(),但更高效,只检查字符串是否以指定查询开始。

re 模块还可以使用特殊序列,你可以在 re 函数中使用这些代码来涵盖各种字符串属性。虽然有很长的特殊序列列表,但在本级别中我们将使用以下几个:

  • \B: 检查指定字符是否存在于字符串中,但不位于单词的开头或结尾。
  • \D: 返回非数字字符(即不是 0-9 的字符)。

如果在特殊序列前有 r,这表示程序在检查原始字符串。

首先,前往金色 X 标记处并面向有备忘录的桌子,使用 read() 函数检查包含所有员工清单的备忘录。每个名字中包含 # 来划分其员工编号,这个包含名字的字符串也存储在一个名为 manifest 的常量中。

创建一个名为 tags 的列表,并将 re.findall() 的返回值存入其中,用于在 manifest 常量中搜索所有 #,如下所示:

tags = re.findall("#", manifest)

创建一个变量 number,并利用 len() 函数对 tags 列表中的项目进行计数,这将告诉我们备忘录中有多少个员工。使用 speak() 函数和 number 变量来宣布列表中的名字数量。

接下来,前往蓝色地毯旁的明亮 X 标记处,面向桌子,使用 read() 函数。在这里,你将看到一份包含新员工及其分配岗位的列表。记下每个职位中的名字,以便与当前已分配人员进行核对。然后,前往蓝色地毯上的 X 标记处,再次使用 read() 函数以验证当前分配的岗位。

当前的员工分配存储在一个名为 assignments 的常量中,我们必须根据新员工列表更新这份文档。使用 re.sub() 函数替换列表中不同的名字,将字符串中的一部分替换为另一部分。例如,以下是其中一次编辑的示例:

assignments = re.sub("Billy Hodgins", "Carol Hopkins", assignments)

文档中的名称 "Billy Hodgins" 被替换为 "Carol Hopkins"。除了这一处更换外,请扫描文档并更新列表中的这一处及另一处名称,以便完成文档的更新。使用 write() 函数和 assignments 检查结果。

现在我们已经处理了员工名单的工作,接下来是农场分区。前往红色地毯上昏暗的 X 标记处,并使用 read() 函数,这将显示分区的详细检查情况。这些信息存储在一个名为 zones 的常量中。

特别需要注意的是,需要确认文档中 6210 的位置,因为该区域需要重新评估。为此,我们需要使用 re.search() 函数确定该分区编号在分区中的位置。创建一个名为 index 的变量,将搜索对象存入其中,并将搜索设置为 r"6210\B"。这意味着:前面的 r 表示使用原始字符串,6210 是我们要查找的分区编号,而 \B 是用于搜索的特殊序列条件。实现方式如下:

index = re.search(r"6210\B", zones)

既然 index 已保存了搜索对象,现在是时候使用 span() 从中提取数据了。创建一个名为 vector 的变量,将该搜索对象的位置存入其中,如下所示:

vector = index.span()

设置完成后,使用预编写的 write() 函数和该向量变量输出结果。

接下来,我们将识别分区项,前往绿色地毯上昏暗的 X 标记处。创建一个名为 sectors 的列表,并使用 re.split() 函数将各个分区整合成一个列表。在 split 函数中,使用特殊序列 "\D" 以便从 zones 变量中仅提取数字。利用列表推导移除列表中所有空项,并使用 len() 函数过滤掉长度不足以构成分区编号的项,如下所示:

sectors = re.split("\D", zones) sectors = [x for x in sectors if len(x) > 3]

使用 write() 函数和 zones 来记录所有分区编号。

前往紫色地毯旁的明亮 X 标记处并面向文件柜,使用 read() 函数验证农场分区中的优先分区。记下这些分区,因为我们需要核实它们是否存在于分区列表中。

前往紫色地毯上昏暗的 X 标记处,这里有三个优先分区,分别存储在变量 sector_asector_bsector_c 中,这些变量在代码编辑器中已预编写。请将你在明亮 X 标记处读取到的数值赋值给它们。这些变量使用列表推导,通过 re.match() 函数从 sectors 列表中过滤出所有项目。使用 sector_asector_bsector_c 变量,并将它们传入预编写的 write() 函数中以完成本级别。

代码书