首页 > 解决方案 > 用字典中的值替换字符串中的正则表达式,同时检索索引

问题描述

给定一个字典和一个字符串:

my_dict = {"X":"xxx", "Y":"yyy"}
my_str = "A[xxx]BC[yyy]"  # editted to comment below

我需要创建两个不同的字符串:

> print(result_1)
'ABC'
> print(result_2)
1|X|3|Y

其中result_1是不带方括号的my_str ,而result_2是不带方括号的字符串中该位置的索引。

到目前为止,我能够找到所有方括号:

vals = re.findall(r'\[([^]]*)\]', my_str)
for val in vals:
    print(val)

我知道我可以使用str.index()str.find()找到索引,如此所述,我也知道我可以使用re.sub()替换值,但我需要将这些方法与在字典中查找以获得两个不同的字符串。任何人都可以帮助我或让我走上正确的道路吗?

标签: regexpython-3.x

解决方案


您可以使用类似的解决方案

import re
my_dict = {"X":"xxx", "Y":"yyy"}
my_str = "A[xxx]BC[yyy]"

def get_key_by_value(dictionary, value):
    for key, val in dictionary.items():
        if val == value:
            return key
    return value  # If no key has been found

rx = re.compile(r'\[([^][]*)]')
result_1 = rx.sub('', my_str)
result_2_arr = []
m = rx.search(my_str)
tmp = my_str
while m:
    result_2_arr.append("{}|{}".format(m.start(), get_key_by_value(my_dict, m.group(1))))
    tmp = "".join([tmp[:m.start()], tmp[m.end():]])
    m = rx.search(tmp)

print ( result_1 )
print ( "|".join(result_2_arr) )

查看Python 演示

输出:

ABC
1|X|3|Y

这是从输入字符串result_1中删除子字符串的结果。[...]

由以下result_2组成:

  • 在字符串中查找\[([^][]*)]匹配项
  • 如果匹配,则取匹配的起始索引,在字典中搜索字典键,如果存在,则返回键,否则返回值,并将匹配从字典中删除字符串和下一个正则表达式搜索是在修改后的字符串上完成的。然后,结果与|.

推荐阅读