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处理迭代本身的匹配函数)而不是使用列表切片生成所有子字符串的副本。