python - 查找所有匹配项并用索引迭代替换
问题描述
我有以下问题:
我想用索引标记找到的匹配项。例子:
x = "hayde hayde bim bam hayde hayde bim bam hayde hayde bim bbm ba bi bim"
我想将所有的bim
s 和bam
s替换为<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
. 这是我的问题的一个抽象示例
解决方案
我怀疑可能有另一种方法可以更直接地解决您的真正问题,但试试这个:
代码
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”)略有不同。