首页 > 解决方案 > 查找所有匹配项并用索引迭代替换

问题描述

我有以下问题:

我想用索引标记找到的匹配项。例子:

x = "hayde hayde bim bam hayde hayde bim bam hayde hayde bim bbm ba bi bim"

我想将所有的bims 和bams替换为<1>, <2>, ..

像这样:

x = "hayde hayde <1> <2> hayde hayde <3> <4> hayde hayde <3> bbm ba bi <5>"

并得到输出有一个字典:

{"bim": "<1>"}
{"bam": "<2>"}
..

我认为这是一个简单的问题,但我找不到解决这个问题的方法。我必须使用re模块来找到匹配项,而不是str.replace. 这是我的问题的一个抽象示例

标签: pythonregexreplace

解决方案


我怀疑可能有另一种方法可以更直接地解决您的真正问题,但试试这个:

代码

import collections as ct


def replace(s, subs):
    """Return a tuple of substitutes and a related dict."""
    dd = ct.defaultdict(list)
    replaced = []
    for i, word in enumerate(s.split()):
        if word in set(subs):
            pos = "<{}>".format(i)
            replaced.append(pos)
            dd[word].append(pos)
        else:
            replaced.append(word)
    return " ".join(replaced), dict(dd)

演示+

x = "hayde hayde bim bam bimbam hayde hayde bim bam hayde hayde bim bbm ba bi bim"
replace(x, ["bim", "bam"])

输出

('hayde hayde <2> <3> bimbam hayde hayde <7> <8> hayde hayde <11> bbm ba bi <15>',
{'bim': ['<2>', '<7>', '<11>', '<15>'], 'bam': ['<3>', '<8>']})

你评论说:

我需要知道,我在哪里清理了字符串。

为什么不用反映实际索引位置的数字来枚举拆分字符串?因此,此示例中的数字替换表示拆分字符串的索引位置。如果您愿意,您可以轻松地将它们换成递增计数器。

+注意:测试输入与 OP(“bimbam”)略有不同。


推荐阅读