Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找通过从给定字符串中删除字母而创建的单词_Python_Regex_String - Fatal编程技术网

Python 查找通过从给定字符串中删除字母而创建的单词

Python 查找通过从给定字符串中删除字母而创建的单词,python,regex,string,Python,Regex,String,我正在尝试使用regex和我的文本文件编写代码。我的文件逐行包含以下文字: each expressions flags in from given line of once lines no 我的目的是;显示通过从给定子字符串中删除字母创建的单词 比如,;如果我的子字符串是“Flamingos”,我的输出应该是 flags in line lines no 因为它们是通过删除字母从我的子字符串创建的,它们也在我的文本文件中 我做了很多关于regex的工作,但我对这个挑战感兴趣。是否有任何r

我正在尝试使用regex和我的文本文件编写代码。我的文件逐行包含以下文字:

each
expressions
flags
in
from
given
line
of
once
lines
no
我的目的是;显示通过从给定子字符串中删除字母创建的单词

比如,;如果我的子字符串是
“Flamingos”
,我的输出应该是

flags
in
line
lines
no
因为它们是通过删除字母从我的子字符串创建的,它们也在我的文本文件中


我做了很多关于regex的工作,但我对这个挑战感兴趣。是否有任何regex解决方案?

您应该为要查找的每个单词创建一个regex。每个字母之间的表达式
*?
是非贪婪模式,这将避免回溯(至少部分回溯),并使搜索速度更快

例如,单词“given”的正则表达式将是
g.*i.*v.*e.*n

import re

def hidden_words(needles, haystack):
    for needle in needles:
        regex = re.compile(('.*?').join(list(needle)))
        if regex.search(haystack):
            yield needle

needles = ['each', 'expressions', 'flags', 'in', 'from', 
           'given', 'line', 'of', 'once', 'lines', 'no']

print(*hidden_words(needles, 'flamingoes'), sep='\n')

基本上每个字符都是可选的。简单的

重新导入
单词=‘火烈鸟’
pattern='''.join(c+'?'表示单词中的c)#?将字母标记为可选
对于打开('file')中的行。readLines():
line=line.strip()
m=重新匹配(图案、线条)
如果m:
打印(行)

应该足够了

为什么的不匹配?@TimBiegeleisen我在我的问题上写了“我做了很多关于regex的工作”,这样就不会显得懒得去寻找像你这样的答案。这只是我想知道的一个问题。@在“火烈鸟”中的第四只鸟,“f”在“o”之前。@的第四只鸟不是匹配的,因为顺序必须保持,因为例如“每个”和“火烈鸟”都包含一个“e”,所以会有部分匹配。您应该添加筛选子句来只筛选完全匹配的
m=re.match(pattern,line);如果m和m[0]==line:print(line)
@Wicaledon:我不想再添加一个答案,因此,我将冒昧地编辑这一条,用我建议的筛选来编辑这个答案。@HåkenLid我也尝试过这个答案,但它没有打印任何东西。我忘了,当你从文件中读取单词时,你必须从每一行中删除尾随的新行。@HåkenLid现在它在我的文件中显示整个单词。它看起来非常漂亮,而且非常有趣很好,但我对你的答案有个问题。打印部分中的
*
sep
部分是什么意思?
sep='\n'
使用换行符作为分隔符,而不是
print
函数的默认单个空格。
*
是python中的解包运算符,这将计算生成器并解包生成器的输出(产量)转换成多个函数参数。这是简短的解释。如果您不熟悉python中的生成器,下面将详细解释生成器函数是什么,以及它们为什么非常有用:。