假设我们有字符串集合作为输入:
str1: ABCD
str2: ABCD
str3: AWXYD
str4: AWXYD
目标是删除重复项并保留唯一项。有了上面的输入,我们的输出应该如下所示:
ABCD
AWXYD
不幸的是,生成此集合的计算机容易出错,有时会遗漏一些字母表(见下文)。幸运的是,我们能够发现缺少部分。但我们不知道这个缺失的部分有多大。实际上我们有以下输入:
str1: A?CD
str2: AB?D
str3: AWXYD
str4: A?D
其中?
表示缺少部分。
在此示例中,我们希望保留A?CD
或AB?D
以及AWXYD
。
为了解决这个问题,我用?
替换.*
并假设这些字符串是正则表达式:
Reg1 --> A.*CD
Reg2 --> AB.*D
Reg3 --> AWXYD
Reg4 --> A.*D
现在我试图通过比较正则表达式来识别重复项。使用此方法,可以轻松地将Reg4
与Reg3
匹配,因为Reg3
实际上是一个字符串(没有丢失的部分)。当两者都缺少部件时,事情变得复杂,因此你必须比较正则表达式。
我想知道是否有可能或者是否有更好的解决方案。
谢谢!
修改1 :请注意,str1
和str2
可能来自不同的字符串(例如AXCD
和ABXD
)。我们的目标是删除任何(可能的)重复项,并确保保留的字符串是唯一的(即使我们删除更多)。这就是我们保留str1
或str2
的原因。感谢Aaron指出了这一点。
编辑2 :有数百万字符串。这就是为什么需要算法的原因。
答案 0 :(得分:2)
我不认为正则表达式适合这样的任务。如果您询问是否有实现的方式来比较正则表达式,则答案为否。至少我还没有看到它。如果你问是否有办法实现它,我会说是的。您可以将正则表达式表示为有限状态机以及图形。并且可以检查这些事物的同构性。但是为正则表达式做这件事会非常复杂。我现在脑子里想到的三件事是:Levenshtein distance algorithm,Binary search tree(搜索效率极高的数据结构)和Black Board architecture。而且here你会找到几个可以帮助你的答案。祝你好运!
P.S PostgreSQL有fuzzystrmatch
模块和Levenshtein算法实现。
答案 1 :(得分:0)
我认为问题在于你的模式。
Reg1 --> A.*CD
和
Reg2 --> AB.*D
有时,它们代表相同的模式,例如。
ABCD
此Reg1
或Reg2
可与此文字匹配。这意味着Reg1
和Reg2
内部存在一些重复的模式。
您可以通过将模式更改为
来解决问题Reg1 --> A(?!B).*CD
// (?!B) means the second character can be any letters except `B`
和
Reg2 --> A.*(?<!C)D
// (?<!C) means the second last character can be any letters except `C`
否则你无法区分这两种模式。