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 – 正在分析的原始文本, 正則表達式 – 正則表達式模式, 德林 — 用於顯示結果的分隔符。

接下來我們調用函數 網頁,在其參數中形成上述 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 形式的日期。

作為分隔符(參數 德林) 輸入分號。

點擊後 OK 我們的魔術函數根據我們的正則表達式分析所有初始數據,並為我們形成一列,其中包含找到的發票編號和日期:

Power Query 中的正則表達式 (RegExp)

仍然使用該命令用分號分隔它 主頁 — 拆分列 — 按分隔符 (首頁 - 拆分列 - 按分隔符) 我們得到了我們想要的:

Power Query 中的正則表達式 (RegExp)

美女!

示例 2:從文本中提取電子郵件地址

假設我們有下表作為初始數據:

Power Query 中的正則表達式 (RegExp)

…從那裡我們需要提取在那裡找到的電子郵件地址(為了清楚起見,我在文本中用紅色突出顯示了它們)。

與前面的示例一樣,我們通過標準方式將表加載到 Power Query 中 數據 – 來自表/範圍 (數據——來自 T能/R天使).

然後我們通過我們的函數添加一個計算列 添加列 – 調用自定義函數 (添加列——調用自定義函數) 並輸入其參數:

Power Query 中的正則表達式 (RegExp)

解析電子郵件地址是一項比較困難的任務,有一堆不同程度的噩夢的正則表達式來解決它。 我使用了一個簡單的選項——並不理想,但在大多數情況下都很有效:

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

作為分隔符 (德林) 您可以輸入分號和空格。

點擊 OK 我們得到一列,其中包含從原始文本“porridge”中提取的電子郵件地址:

Power Query 中的正則表達式 (RegExp)

魔法!

PS

俗話說:“天下無不勝事。” Power Query 本身就很酷,當與正則表達式結合使用時,它為我們提供了處理任何文本數據時完全不切實際的能力和靈活性。 我希望微軟有一天會在 Power Query 和 Power BI 更新中添加 RegExp 支持,並且上述所有與手鼓共舞的事情都將成為過去。 好吧,就目前而言,是的。

我還想補充一點,在網站 https://regexr.com/ 上使用正則表達式很方便——就在在線編輯器中。 在該部分 社區模式 所有場合都有大量現成的常規賽季。 實驗 - 正則表達式的所有功能現在都可以在 Power Query 中為您服務!

  • 什麼是正則表達式 (RegExp) 以及如何在 Excel 中使用它們
  • Power Query 中的模糊文本搜索
  • 使用 Power Query 組合來自不同文件的表

發表評論