查找所有匹配项并用索引迭代替换

2024-05-28 23:34:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下问题:

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

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

我想用<1>, <2>, ..替换所有的bimbam

像这样:

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

得到的输出有一个dict:

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

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


Tags: 模块方法标记re示例dictreplace例子
1条回答
网友
1楼 · 发布于 2024-05-28 23:34:45

我想也许有另一种方法可以更直接地解决你真正的问题,但试试这个:

代码

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>']})

您评论:

I need to know, where I cleaned up the strings.

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

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

相关问题 更多 >

    热门问题