regex - 用字典中的值替换字符串中的正则表达式,同时检索索引
问题描述
给定一个字典和一个字符串:
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()替换值,但我需要将这些方法与在字典中查找以获得两个不同的字符串。任何人都可以帮助我或让我走上正确的道路吗?
解决方案
您可以使用类似的解决方案
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) )
输出:
ABC
1|X|3|Y
这是从输入字符串result_1
中删除子字符串的结果。[...]
由以下result_2
组成:
- 在字符串中查找
\[([^][]*)]
匹配项 - 如果匹配,则取匹配的起始索引,在字典中搜索字典键,如果存在,则返回键,否则返回值,并将匹配从字典中删除字符串和下一个正则表达式搜索是在修改后的字符串上完成的。然后,结果与
|
.
推荐阅读
- testing - grails 代码覆盖无法访问方法
- swift - Swift:UITableView 将日历事件数据传递给 DetailViewController
- python - 尝试基于正则表达式替换 .docx 文件中表中的文本
- powershell - 从工作流更新全局变量
- java - 即使在 Java 中未选中 Systems Daylight 选项,也始终使用 Java 中的夏令时获取时区
- c++ - 属性系统中属性的 QVariant(QString, “”) 是什么意思?
- c# - Revit 的 Process.GetCurrentProcess().MainWindowTitle 检索空字符串“”
- php - PHP/MySQL - 如何在“while”循环中将其他元素推送到数组中?
- python - 向上舍入浮动字段
- java - 在 ARCore 中,如何使节点/锚点粘在相机上?