在 Excel 中使用 Python 时,首先要记住的是,新的集成提供了一个自定义的 xl(“range”, headers) 函数来引用工作簿中的数据。此函数将在整个示例中派上用场,因为它允许我们引用工作簿中的特定(范围)值,并自动转换为 Python 对象,即 DataFrame 或 Series。通过这种方式,我们可以避免逐个单元格进行处理,而是对整个 DataFrame 使用 Python 向量化函数进行操作。虽然这可能看起来是一个很小的差异,但这将对性能产生巨大影响。这种策略允许您将所有数据收集到一个独特的数据结构中,然后将其发送到 Azure 云上的远程沙盒,而不是为小型计算生成大量网络流量。此外,由于单元格按预定义的顺序执行,因此整个执行将按顺序运行,而不是并行运行。虽然在处理少量条目时,这不会产生太大影响,但在处理整个 1000 行数据集时,这会导致性能出现巨大瓶颈。因此,牢记 Python 在 Excel 执行模型中的重要性始终很重要。有关执行模型和其他编程技巧的更多信息,请参阅此 博客文章

好了!现在是时候编写一些 Python 代码了。首先,让我们定义我们的模式。使用正则表达式匹配 EEID 非常简单:事实上,所有 EEID 都可以通过以下模式捕获:“E\d{5}”,其含义是 “大写字母 E 和 5 位数字。” 详细来说,\d 运算符在正则表达式语法中用于表示数字字符,从 0 到 9;而我们表示字符串中必须包含的这些字符的个数(即“量词”)。在本例中,它指的是五位数字。

让我们继续到 R1 单元格,创建一个新的 =PY() 单元格,并编写以下代码

df = xl("A1:A1001", headers=True)
pattern = "E\d{5}"
df.EEID.str.match(pattern)

首先,我们使用 xl() 函数选择整个 EEID 数据列。这将作为 DataFrame 返回,其中包含一个与之同名的列。这是在 xl 函数调用中传递 headers=True 的结果。然后,我们依靠 pandas 字符串函数 match 在多个行上传播模式匹配。请注意,这种方法完全利用了 pandas 内部对数据循环的优化,避免了 Python 中更慢的显式迭代。表达式 df.EEID.str.match(pattern) 的结果是一个 pandas 布尔值序列,即 True 或 False,具体取决于匹配成功或不成功。要查看工作簿中的值,我们可以将 Python 单元格输出切换到“Excel 值”。结果序列中的所有值将被 Excel 自动溢出到 1000 行。如果您愿意,您甚至可以使用条件格式来突出显示这些单元格,以绿色或红色突出显示模式匹配的结果。

这次,我们将利用 regexp 组(由圆括号标识)来匹配电子邮件地址模式中的所有部分。特别是,第一组匹配帐户名,后跟 @ 符号,然后是域名组。域名实际上被匹配为两个可选子组:前者用于 outlook.mail 域名,后者用于其余三个域名,即 mail.com、email.com 和 gmail.com 。请注意,如何使用精心设计的类和量词组合,我们可以在单个组表达式中匹配这三个域名,即使用 “?” 逻辑量词匹配 email gmail mail 词语。如果我们在电子邮件验证代码中使用这个新的电子邮件模式,我们将使用单个 regexp 识别 无效和错误 的电子邮件地址,从而导致更多条目出现错误。

正则表达式是用于字符串数据验证的极其强大的工具。使用正则表达式,可以检查我们的数据是否符合定义的搜索模式,该模式被定义为特殊运算符和字符序列的组合。在这篇文章中,我们探讨了 Python 在 Excel 集成中如何将这种新功能直接引入到我们的工作簿中,以创建自动数据验证策略。首先,我们介绍了正则表达式的主要概念和运算符,如元字符、字符类和组。然后,我们演示了它们在示例案例中的使用,该示例案例考虑了 1000 个条目的公司员工数据集。使用正则表达式,我们能够识别数据中的拼写错误和不一致,匹配电子邮件地址、员工 ID 和电话号码。包含示例中 Python 代码的 Excel 工作簿的完整版本可在 公开获取