Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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_Python 3.x_Itertools - Fatal编程技术网

Python 获取替换子字符串的所有可能组合

Python 获取替换子字符串的所有可能组合,python,python-3.x,itertools,Python,Python 3.x,Itertools,给定子字符串和任意替换的文本的Python组合 我有一个字符串: "foo bar foo foo" 给定该字符串中的一个子字符串,例如:“foo”我想让每个组合用该“foo”替换任意字符串(它可能有不同的长度) 例如: 组合(“foo-bar-foo-foo”、“foo”、“foer”) { “foo bar foo foo”, “福儿吧福儿”, “foo bar foo er foo”, “福吧福儿”, “foore bar foore foo”, “福儿吧福儿”, “

给定子字符串和任意替换的文本的Python组合

我有一个字符串:

"foo bar foo foo"
给定该字符串中的一个子字符串,例如:
“foo”
我想让每个组合用该
“foo”
替换任意字符串(它可能有不同的长度)

例如:

组合(“foo-bar-foo-foo”、“foo”、“foer”) { “foo bar foo foo”, “福儿吧福儿”, “foo bar foo er foo”, “福吧福儿”, “foore bar foore foo”, “福儿吧福儿”, “富尔吧富尔富尔”, “foo-bar-fooer-fooer”, } 我已经找过了,找不到任何能帮我的东西

我知道我必须对组合使用
itertools.product
,但是当同一个字符串中出现多个外观并且子字符串及其替换具有不同的长度时,我会陷入困境

当我得到我必须开始替换的索引时:

def index_子字符串(a_str,sub):
"""https://stackoverflow.com/a/4665027/9288003"""
开始=0
尽管如此:
start=a_str.find(子,开始)
如果开始==-1:返回
产量起点
start+=len(sub)#使用start+=1查找重叠匹配

您可以按照以下方法操作:

  • 将字符串分隔为单词列表
  • 查找要替换的单词的索引
  • 创建这些索引的幂集
  • 迭代幂集并替换每个幂集索引中的单词

  • 1.将字符串分隔为单词列表 对任何Python用户来说都非常简单:

    words = "foo bar foo foo".split()
    
    如果字符串不一定是空格分隔的,可以使用正则表达式:

    重新导入
    words=re.split(“(foo)”,“foobarfooo”)
    
    2.查找要替换的单词的索引 这可以通过非常简单的列表理解来完成:

    indices = [i for i, v in enumerate(words) if v == "foo"]
    
    3.创建这些索引的幂集 官员有一个用于发电机组的:

    来自itertools导入链,组合
    def动力装置(iterable):
    动力集([1,2,3])-->(1,)(2,)(3,)(1,2)(1,3)(2,3)(1,2,3)
    s=列表(iterable)
    返回链。从_iterable(范围(len(s)+1)内r的组合(s,r))
    
    因此,使用此功能,此步骤非常简单:

    power_set = powerset(indices)
    
    4.迭代幂集并替换每个幂集索引中的单词 为此,我们将首先创建要处理的
    单词
    列表的副本,然后简单地迭代powerset中每个项目的索引,并替换这些索引中的单词。为了结束事情,我们将加入列表:

    用于功率集(索引)中的替换:
    新词=列表(词)
    对于替换中的索引:
    新词[索引]=“foore”
    打印(“.”连接(新词))
    
    *如果使用正则表达式版本,它应该是
    '.join(…)

    完整代码 总的来说,这看起来像:

    来自itertools导入链,组合
    def动力装置(iterable):
    动力集([1,2,3])-->(1,)(2,)(3,)(1,2)(1,3)(2,3)(1,2,3)
    s=列表(iterable)
    返回链。从_iterable(范围(len(s)+1)内r的组合(s,r))
    s=“foo bar foo foo”
    to_find=“foo”
    替换为
    words=s.split()
    #regex:words=re.split(f“({to_find})”,s)
    索引=[i代表i,如果v=to_find,则枚举(单词)中的v]
    对于powerset(索引)中的替换:
    新词=列表(词)
    对于替换中的索引:
    新词[索引]=要替换
    打印(“.”连接(新词))
    #正则表达式:打印(“”.join(新词))
    
    其中:

    foo-bar-foo-foo
    福儿吧福儿
    福吧福儿福
    福吧福儿
    福儿吧福儿福
    富尔吧富尔
    福吧福
    富尔酒吧富尔富尔
    
    这个方法的问题是它不能适用于所有字符串,它只能适用于像字符串这样的句子。例如,如果我们有
    “foobarfooo”
    ,它将什么也找不到。不过我想我可以根据你的答案来解决这个问题。哇,非常感谢,这正是我想要的。我真的很头疼。你在图书馆里找
    组合。