Python 在字符串列表中搜索具有可变字符的单词

Python 在字符串列表中搜索具有可变字符的单词,python,list,search,Python,List,Search,基本上,我从插入单词“brand”开始,用下划线替换单词中的单个字符,然后尝试查找与其余字符匹配的所有单词。例如: “b_和”将返回:“乐队”、“品牌”、“平淡”。。。。等等 我首先使用re.sub替换字符中的下划线。但我真的不知道下一步该去哪里。我只想要与此下划线不同的单词,要么不带下划线,要么用字母替换。比如,如果单词“under”在列表中出现,我不想让它返回“Understand”或“thunder”,只是一个字符的差异。任何想法都会很棒 我试着先用字母表中的每个字母替换这个字符,然后再检

基本上,我从插入单词“brand”开始,用下划线替换单词中的单个字符,然后尝试查找与其余字符匹配的所有单词。例如:

“b_和”将返回:“乐队”、“品牌”、“平淡”。。。。等等

我首先使用re.sub替换字符中的下划线。但我真的不知道下一步该去哪里。我只想要与此下划线不同的单词,要么不带下划线,要么用字母替换。比如,如果单词“under”在列表中出现,我不想让它返回“Understand”或“thunder”,只是一个字符的差异。任何想法都会很棒

我试着先用字母表中的每个字母替换这个字符,然后再检查字典中是否有这个单词,但这花了很长时间,我真的想知道是否有更快的方法

from itertools import chain

dictionary=open("Scrabble.txt").read().split('\n')

import re,string

#after replacing the word with "_", we find words in the dictionary that match the pattern
    new=[]
    for letter in string.ascii_lowercase:
        underscore=re.sub('_', letter, word)
        if underscore in dictionary:
            new.append(underscore)
    if new == []:
        pass
    else:
        return new

这应该可以。我是在函数外部进行的,所以有一个工作示例,但在函数内部进行很简单

string = 'band brand bland cat dand bant bramd branding blandisher'
word='brand'
new=[]
for n,letter in enumerate(word):
    pattern=word[:n]+'\w?'+word[n+1:]
    new.extend(re.findall(pattern,string))
new=list(set(new))
输出:

['bland', 'brand', 'bramd', 'band']
说明:

我们正在使用
regex
来执行您正在查看的操作。在这种情况下,在每次迭代中,我们从“brand”中取出一个字母,并使算法查找任何匹配的单词。因此,它将寻找:

_兰特,布,布,布兰_

对于“b_和”的情况,模式是
b\w?和
,这意味着:找到一个带b的单词,那么任何字符都可能出现,也可能不出现,然后是“和”

然后将所有匹配的单词添加到列表中

最后,我使用
list(set(new))


编辑:忘记添加
string
vairable。

这里是Juan C答案的一个版本,有点像python

重新导入
dictionary=open(“Scrabble.txt”).read().split('\n')
pattern=“b_和”#根据需要进行更改
模式=模式。替换(“”,“?”)
图案+='\\b'
matching_words=[词典中的逐字匹配(模式、单词)]
编辑:根据您的评论修复了正则表达式,快速解释:

pattern=“b_和”
模式=模式。替换(“?”)#模式现在是b和。?匹配任意一个字符(或根本不匹配)
模式+='\\b'#\b阻止与诸如“bandit”或比“b_和”长的单词匹配

这很好,但我如何才能只获得单个字符不同的单词的结果?我用“blandished”、“blandisher”、“blandisher”得到了结果,我只想要我添加的单个字符差异“\b”,我相信这解决了你的问题