PowerShell中的模糊字符串匹配

Posted

技术标签:

【中文标题】PowerShell中的模糊字符串匹配【英文标题】:Fuzzy string match in PowerShell 【发布时间】:2018-04-25 15:27:03 【问题描述】:

如何在 PowerShell 脚本中进行模糊字符串匹配?

我有不同来源的不同人名集合,并将它们存储在一个数组中。当我添加一个新名称时,我喜欢将该名称与现有名称进行比较,如果它们模糊匹配,我喜欢认为它们是相同的。例如,数据集为:

@("George Herbert Walker Bush",
  "Barbara Pierce Bush",
  "George Walker Bush",
  "John Ellis (Jeb) Bush"  )

我希望看到给定输入的以下输出:

"Barbara Bush" -> @("Barbara Pierce Bush")
"George Takei" -> @("")
"George Bush"  -> @("George Herbert Walker Bush","George Walker Bush")

至少,我希望匹配不区分大小写,并且尽可能灵活地处理某种程度的拼写错误。

据我所知,标准库不提供此类功能。有没有一个易于安装的模块可以做到这一点?

【问题讨论】:

如果只是匹配其他字符串中的字符串,the -Match operator would do. -like operator。 【参考方案1】:

在PowerShell Gallery 搜索“模糊”一词,我找到了这个包:Communary.PASM。

它可以简单地安装:

PS> Install-Package Communary.PASM                                                                                                     

该项目在 GitHub 中找到 here。我只是看了this examples file作为参考。

这是我的例子:

$colors = @("Red", "Orange", "Yellow", "Green", "Blue", "Violet", "Sky Blue" )

PS> $colors | Select-FuzzyString Red

Score Result
----- ------   
  300 Red

这是一场完美的比赛,每个角色的最高得分为 100。

PS> $colors | Select-FuzzyString gren

Score Result
----- ------
  295 Green 

它可以容忍一些缺失的字符。

PS> $colors | Select-FuzzyString blue

Score Result  
----- ------     
  400 Blue       
  376 Sky Blue

可以返回多个具有不同分数的值。

PS> $colors | Select-FuzzyString vioret

# No output

但它不能容忍一点点拼写错误。然后我也试了Select-ApproximateString

PS> $colors | Select-ApproximateString vioret
Violet

这有不同的 API,它只返回一个匹配项或不返回任何内容。当Select-FuzzyString 这样做时,它也可能不会返回任何东西。

这是在 MacOS 和 Communary.PASM 1.0.43 上使用 PowerShell Core v6.0.0-beta.9 测试的。

【讨论】:

以上是关于PowerShell中的模糊字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章

字符串模糊匹配

postgres jsonb列中的模糊字符串匹配

列表性能中的Python模糊匹配字符串

“模糊匹配”字符串的算法

python模糊匹配库能否定制匹配关系

如何在 Ruby 中进行模糊子字符串匹配?