Regex 匹配不允许有任何差异的单词

Regex 匹配不允许有任何差异的单词,regex,linux,bash,terminal,similarity,Regex,Linux,Bash,Terminal,Similarity,我想知道是否有任何工具可以为bash终端匹配几乎相同的单词 在以下名为list.txt的文件中,每行包含1个单词: ban 1ban 12ban 12ban3 很容易找到包含“ban”的单词 问题: 如何实际匹配有x个字母差异的单词? 使用搜索词“ban”,我希望X=1的匹配项为“1ban” 关于距离的概念,我想要最大值: X删除 或X替换 或X插入 任何工具,但最好是可以在bash终端上作为命令行调用的工具 注:Levenshtein距离将2个字母的插入计算为1个差异。这不是我想要的。您可以

我想知道是否有任何工具可以为bash终端匹配几乎相同的单词

在以下名为list.txt的文件中,每行包含1个单词:

ban
1ban
12ban
12ban3
很容易找到包含“ban”的单词

问题:

如何实际匹配有x个字母差异的单词? 使用搜索词“ban”,我希望X=1的匹配项为“1ban”

关于距离的概念,我想要最大值: X删除 或X替换 或X插入

任何工具,但最好是可以在bash终端上作为命令行调用的工具

注:Levenshtein距离将2个字母的插入计算为1个差异。这不是我想要的。

您可以使用支持模糊匹配的Python类

由于您实际上希望匹配最大X差的单词(1个删除或1个替换或1个删除),您可以创建一个Python脚本,如

#!/usr/bin/env python3
import regex, io, sys

def main(argv):
        if len(argv) < 3:
                # print("USAGE: fuzzy_search -searchword -xdiff -file")
                exit(-1)
        search=argv[0]
        xdiff=argv[1]
        file=argv[2]
        # print("Searching for {} in {} with {} differences...".format(search, file, xdiff))
        with open(file, "r") as f:
                contents = f.read()
                print(regex.findall(r"\b(?:{0}){{s<={1},i<={1},d<={1}}}\b".format(regex.escape(search), xdiff), contents))

if __name__ == "__main__":
        main(sys.argv[1:])
其中,
“ban”
是正在执行模糊搜索的单词,
1
是差异的上限

我得到的结果是

['ban', '1ban']
您可以将输出格式更改为“仅限行”:

print("\n".join(regex.findall(r"\b(?:{0}){{s<={1},i<={1},d<={1}}}\b".format(regex.escape(search), xdiff), contents)))

您可以通过使用python检查每个字符来检查差异,如下所示

def is_diff(str1, str2):
    diff = False
    for char1, char2 in zip(str1, str2):
        if char1 != char2:
            if diff:
                return False
            else:
                diff = True
    return diff
with open('list.txt') as f:
    data = f.readlines()

for line in data:
    print is_diff('ban', line)

也许你想要grep“[a-z]anana”list.txt?甚至
grep“[^[:space:]anana”list.txt
。也许,你的答案是。试试看,如果Python发挥作用,你可以使用PyPi正则表达式包,并结合正则表达式功能使用模糊匹配。你正在为一组未知的需求提供一些解决方案。这不是一个好主意,因为没有确切的要求,所有的解决方案都被认为是好的和错的-请用一组真正的要求更新问题。你是否在搜索整个单词?你想考虑什么样的编辑?只是替换而不插入/删除?请回答这个问题。是的,我确实理解为什么回答这个问题很难。距离的概念可以用不同的方式来解释。我在寻找完整的单词,实际上我希望有最大的X差异(所以1个删除或1个替换或1个删除)。你能更新你的答案吗?谢谢!这看起来像是在做这项工作。。。除了我不能用它来搜索x差异(假设你允许2个差异而不是1)。显然,它并没有消除行尾字符。使用f.readline().strip(),我可以在每一行上循环,但是regexp有问题。你能给我解释一下你的表达方式吗?@Gildas如果你需要不超过2个替换,请替换
s@Gildas请更新您的问题,以更具体地了解您想要什么。我现在的回答给你一个跳跃式的开始。嗨,Wiktor。我还在测试你的答案。我创建了一个传递给正则表达式r“(?:{})的变量X{{s@Gildas完全正确。如果要匹配整个单词,请在两端使用单词边界
\b
,即
r”\b(?:{0}){s
print("\n".join(regex.findall(r"\b(?:{0}){{s<={1},i<={1},d<={1}}}\b".format(regex.escape(search), xdiff), contents)))
ban
1ban
def is_diff(str1, str2):
    diff = False
    for char1, char2 in zip(str1, str2):
        if char1 != char2:
            if diff:
                return False
            else:
                diff = True
    return diff
with open('list.txt') as f:
    data = f.readlines()

for line in data:
    print is_diff('ban', line)