Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_String_Glob - Fatal编程技术网

python-查找字符串中包含通配符的所有子字符串

python-查找字符串中包含通配符的所有子字符串,python,string,glob,Python,String,Glob,我试图编写一个函数来返回在较长字符串中包含通配符(每个通配符只包含一个字符)的子字符串的所有匹配项。 例如,假设我有主题字符串: aabcddcababedcbaba我的查询字符串是b?d??ab。 预期产出将是: ['bcddcab','bedcbab'] 通过查看其他堆栈溢出帖子,我尝试了以下方法: import fnmatch subject = "aabcddcabaabedcbabaa" query = "b?d??ab" res = fnmat

我试图编写一个函数来返回在较长字符串中包含通配符(每个通配符只包含一个字符)的子字符串的所有匹配项。 例如,假设我有主题字符串:
aabcddcababedcbaba
我的查询字符串是
b?d??ab
。 预期产出将是:
['bcddcab','bedcbab']

通过查看其他堆栈溢出帖子,我尝试了以下方法:

import fnmatch
subject = "aabcddcabaabedcbabaa"
query = "b?d??ab"
res = fnmatch.filter(subject, query)
但这将返回一个空列表。我做错了什么?我是否正确使用了
fnmatch
filter
功能?提前感谢您

  • 查询应该是
    过滤器
    的第二个参数,而不是第一个参数
  • filter
    通过保留与查询匹配的字符串来筛选字符串列表。
    filter
    不返回字符串的子字符串列表。如果要使用
    filter
    筛选子字符串,首先需要构建子字符串列表:
import-fnmatch
subject=“aabcddcabababedcbaba”
query=“b?d??ab”
substring=fnmatch.filter((主题[i:i+len(查询)],用于范围(len(主题)-len(查询))、查询中的i)
打印(子字符串)

输出:
['bcddcab','bedcbab']

我认为您需要交换查询和subjectSee。此外,globs需要匹配整个字符串,因此需要类似于
query=“*b?d??ab*”
@Techniquab ah yes的内容。很抱歉写问题时出错了。在我的代码中,它们的顺序是正确的。更新question@WiktorStribi谢谢你的评论。它不起作用了。理解。谢谢你的回答。它起作用了。但是,出于好奇,您是否认为有更好/更有效的方法,因为我的数据中的实际字符串长度将为数千个字符?(确实,我还没有在实际数据示例中计时)如果不计时,很难说,但是,如果字符串不是从一辆野车开始的,那么你可以从找到可能的开始位置开始,而不是从字符串中的所有索引开始,是的,很难说。它可以从一个通配符开始,但我明白你的意思:从一开始就根据查询子字符串减少搜索空间,直到第一次出现通配符。我想在我的例子中,为了安全起见,我将生成所有可能的子字符串。如果我遇到速度/内存问题,我会重新考虑。谢谢tho@Techniquab!我选择它作为正确答案,因为它显示了
fnmatch
filter
函数的正确使用。然而,当数据由很长的字符串组成时,可能有一种更有效的方法(比如使用regex),我对
fnmatch
不是很熟悉,但通常使用索引会更有效(使用可以传递字符串、起始索引和子字符串长度的匹配函数;或使用显式搜索子字符串并由thuse处理迭代本身的匹配函数)而不是使用列表切片生成所有子字符串的副本。