Power Query 中的正则表达式 (RegExp)

如果您至少稍微熟悉正则表达式,那么您不需要宣传它们。 如果您不太了解该主题,那么正则表达式(Regular Expressions = RegExp = “regexps” = “regulars”)是一种语言,其中使用特殊字符和规则,在文本中搜索必要的子字符串,并提取它们或替换为其他文本。 这是一个非常强大和漂亮的工具,比所有其他处理文本的方式都要好一个数量级。

我已经通过生活中的大量示例详细描述了如何使用简单的宏向 Excel 添加正则表达式支持——如果您还没有阅读本文,我强烈建议您在继续之前阅读它。 你会发现很多新东西,我保证🙂

但是,问题仍然悬而未决——如何在 Power Query 中添加使用正则表达式的功能? 当然,Power Query 本身就很好,它可以对文本做很多事情(剪切、粘合、清理等),但是如果你可以用正则表达式的力量来跨越它,那它就只是一个炸弹。

不幸的是,在 Power Query 中没有用于使用 RegExps 的内置函数,微软官方帮助和技术支持对此问题的回答是否定的。 但是,有一种方法可以绕过这个限制🙂

方法的本质

主要思想很容易丢脸。

在内置 Power Query 功能列表中,有一个函数 网页. 微软官方帮助网站上对这个功能的描述非常简洁:

Power Query 中的正则表达式 (RegExp)

翻译后,这将是:“返回分解成其组件结构的 HTML 文档的内容,以及删除标记后完整文档及其正文的表示。” 坦率地说,马马虎虎的描述。

通常这个功能在从网页导入数据的时候会用到,会自动替换,比如我们在选项卡上选择的时候 时间 命令 来自网络 (数据——来自网络). 我们给函数一个网页作为参数,它以表格的形式将其内容返回给我们,之前清除了所有的标签。

帮助没有说的是除了 HTML 标记语言 功能 网页 支持 JavaScript 脚本,现在在 Internet 上的网站上无处不在。 反过来,JavaScript 始终能够使用正则表达式,并具有 RegExps 的内置函数! 因此,要在 Power Query 中实现正则表达式,我们需要将 Web.Page 函数作为参数提供给一个小型 JavaScript 程序,该程序将为 Power Query 完成所有工作。

它在纯 JavaScript 中的样子

网上有很多关于在 JavaScript 中使用正则表达式的详细教程(例如一、二)。

简而言之,JavaScript 代码将如下所示:

Power Query 中的正则表达式 (RegExp)

这里:

  • var str = '为香肠支付 123 和 789 的账单'; – 创建一个变量 STR 并为其分配我们将分析的源文本。
  • var 模式 = /d+/gi; – 创建一个正则表达式并将其放入一个变量中 模式.

    表达式以斜杠 (/) 开头。

    例如,这里的表达式本身是 d+ 代表任何数字序列。

    通过表达式后面的分数,还有额外的搜索参数(修饰符)——它们可以按任意顺序指定:

    • g – 表示全局搜索,即找到匹配项后,不应该停止,而是继续搜索,直到文本结束。 如果未设置此修饰符,则我们的脚本将仅返回第一个匹配项 (123)
    • i - 搜索不考虑字母大小写
    • m – 多行搜索(在源文本被分成几行时使用)
  • var 结果 = str.match(pattern).join(';'); – 在源文本中执行搜索(STR) 通过给定的正则表达式 (模式) 并将结果放入变量中 导致, 使用命令将它们用分号连接起来 加入
  • document.write(结果); – 显示结果变量的内容

另请注意,JavaScript 中的文本字符串(不包括正则表达式)用撇号括起来,而不是像 Power Query 或 VBA 中那样用引号括起来。

在输出中,此脚本将作为结果为我们提供在源文本中找到的所有数字:

123,789

JavaScript 短期课程结束,谢谢大家。 希望你明白逻辑🙂

仍需将此构造转移到 Power Query。

Power Query中的正则表达式搜索和提取文本函数

我们执行以下操作:

1. 打开 Excel 并在选项卡中创建一个新的空 Power Query 数据——获取数据/创建请求——来自其他来源——空请求 (数据——获取数据/新查询——来自其他来源——空白查询). 如果您有旧版本的 Excel 2010-2013 和 Power Query,但您没有内置,而是作为单独的加载项安装,那么所有这些都将显示在选项卡上 电源查询并不是 时间.

2. 在打开的查询编辑器的空白窗口中,在右侧面板中,立即输入我们未来函数的名称(例如, fxRegExpExtract 函数)

Power Query 中的正则表达式 (RegExp)

3. 让我们去标签 查看 - 高级编辑器 (查看 - 高级编辑器),我们删除空请求的整个 M 代码并将我们的超函数的代码粘贴到那里:

Power Query 中的正则表达式 (RegExp)

注意你的手:

在第一行,我们说我们的函数将有三个文本参数: TXT – 正在分析的原始文本, 正则表达式 – 正则表达式模式, DELIM — 用于显示结果的分隔符。

接下来我们调用函数 网页,在其参数中形成上述 JavaScript 代码。 我们将变量参数粘贴并替换到代码中。

分段:

[数据]{0}[儿童]{0}[儿童]{1}[文本]{0}

……需要“通过”表格,得到我们需要的结果。 重点是功能 网页 结果,它生成了几个重复网页结构的嵌套表。 如果没有这段 M 代码,我们的函数将输出:

Power Query 中的正则表达式 (RegExp)

......我们将不得不多次点击这个词 , 依次“落入”列中的子嵌套表中 儿童:

Power Query 中的正则表达式 (RegExp)

代替所有这些引用,我们立即在函数的代码中指出嵌套表和列 (文本) 我们需要。

事实上,这里就是所有的秘密。 它仍然按下按钮 完成 在窗户里 高级编辑器,我们在其中插入了我们的代码,您可以继续进行最美味的 - 在工作中尝试我们的功能。

这里有几个种子示例。

示例 1. 从付款说明中检索帐号和日期

我们有一份包含付款说明(目的)的银行对账单,您需要在其中将已付款发票的编号和日期提取到单独的列中:

Power Query 中的正则表达式 (RegExp)

我们通过标准方式将表加载到 Power Query 中 数据 – 来自表/范围 (数据——来自 T能/R天使).

然后我们通过我们的函数添加一个计算列 添加列 – 调用自定义函数 (添加列——调用自定义函数) 并输入其参数:

Power Query 中的正则表达式 (RegExp)

作为正则表达式(参数 正则表达式) 我们使用的模板:

(d{3,5}|d{2}.d{2}.d{4})

……翻译成人类语言的意思: 

3 到 5 位数字(帐号)

or

“2 位数 - 点 - 2 位数 - 点 - 4 位数”形式的片段,即 DD.MM.YYYY 形式的日期。

作为分隔符(参数 DELIM) 输入分号。

点击后 OK 我们的魔术函数根据我们的正则表达式分析所有初始数据,并为我们形成一列,其中包含找到的发票编号和日期:

Power Query 中的正则表达式 (RegExp)

仍然使用该命令用分号分隔它 主页 — 拆分列 — 按分隔符 (首页 - 拆分列 - 按分隔符) 我们得到了我们想要的:

Power Query 中的正则表达式 (RegExp)

美女!

示例 2:从文本中提取电子邮件地址

假设我们有下表作为初始数据:

Power Query 中的正则表达式 (RegExp)

......我们需要从中提取在那里找到的电子邮件地址(为清楚起见,我在文本中用红色突出显示了它们)。

与前面的示例一样,我们通过标准方式将表加载到 Power Query 中 数据 – 来自表/范围 (数据——来自 T能/R天使).

然后我们通过我们的函数添加一个计算列 添加列 – 调用自定义函数 (添加列——调用自定义函数) 并输入其参数:

Power Query 中的正则表达式 (RegExp)

解析电子邮件地址是一项更困难的任务,有一堆不同程度的噩梦的正则表达式来解决它。 我使用了一个简单的选项——并不理想,但在大多数情况下都很有效:

[w|.|-]*@w*.[w|.]*

作为分隔符 (DELIM) 您可以输入分号和空格。

点击 OK 我们得到一列,其中包含从原始文本“porridge”中提取的电子邮件地址:

Power Query 中的正则表达式 (RegExp)

魔术!

PS

俗话说:“天下无不胜事。” Power Query 本身就很酷,当与正则表达式结合使用时,它为我们提供了处理任何文本数据时完全不切实际的能力和灵活性。 我希望微软有一天会在 Power Query 和 Power BI 更新中添加 RegExp 支持,并且上述所有与手鼓共舞的事情都将成为过去。 好吧,就目前而言,是的。

我还想补充一点,在网站 https://regexr.com/ 上使用正则表达式很方便——就在在线编辑器中。 在该部分 社区模式 所有场合都有大量现成的常规赛季。 实验 - 正则表达式的所有功能现在都可以在 Power Query 中为您服务!

  • 什么是正则表达式 (RegExp) 以及如何在 Excel 中使用它们
  • Power Query 中的模糊文本搜索
  • 使用 Power Query 组合来自不同文件的表

发表评论