python - Python3 使用 Dict 和正则表达式替换字符串
问题描述
我有一个输入字段,用户可以插入包含在 * 中的变量,然后我使用正则表达式来获取变量,我试图在 dict 中查找它们,然后在输入字符串中替换它们。在下面的代码中,我设法编写了获取变量的正则表达式,然后将其匹配并创建一个包含值的列表,但我不确定如何使用它来替换字符串中的内容。
variables = {
'*FFullName*': 'Raz Smith',
'*FFirstName*': 'Raz',
'*FSurname*': 'Smith',
'*Subject*': 'hello',
'*Day*': '27',
}
input = '*Day* *Subject* to *FFirstName* *FSurname*'
#get all the *variables* and add to list
var_input = re.findall('(\*.*?\*)', input)
#match above list with dict
match = list(map(variables.__getitem__, var_input))
#how to replace these in input?
#expected outcome: input = '27 Hello to Raz Smith'
我通过使用在此处找到的以下代码接近了,但是,当输入字段中的变量没有空格时,它不匹配。
#example of input not working correctly
input = '*Day**Subject*to*FFirstName**FSurname*'
pattern = re.compile(r'(?<!\*)(' + '|'.join(re.escape(key) for key in variables.keys()) + r')(?!\*)')
result = pattern.sub(lambda x: variables[x.group()], input)
解决方案
您可以使用
import re
variables = {
'*FFullName*': 'Raz Smith',
'*FFirstName*': 'Raz',
'*FSurname*': 'Smith',
'*Subject*': 'hello',
'*Day*': '27',
}
text = '*Day* *Subject* to *FFirstName* *FSurname*'
var_input = re.sub(r'\*[^*]*\*', lambda x: variables.get(x.group(), x.group()), text)
print(var_input)
# => 27 hello to Raz Smith
您不需要捕获整个匹配项,这就是现在从模式中删除的(
原因。)
该\*[^*]*\*
模式匹配 a *
,然后是零个或多个字符,而不是*
a *
。
整个匹配re.sub
通过 lambda 表达式传递给替换参数,并variables.get(x.group(), x.group())
从字典中获取相应的值variables
,或者如果没有以匹配值作为键的项目,则将匹配返回。
推荐阅读
- c# - 如何结合 ILogger 和 Application Insights
- node.js - nodejs在共享主机中生成进程,导致它崩溃
- java - RxJava fromCallable 和取消订阅
- python - 无法传递字符串变量以从 python 函数返回数据,以便在 Python 脚本或程序中的任何地方全局使用
- python - 格式化德语日期导致未转换的数据仍然存在:am
- sql - 为什么 Docker 中的 MSSQL 在 sql 查询中返回“最后一个操作已终止,因为用户按下了 CTRL+C”?
- html - 如何复制文件夹并更改名称?
- ios - swift enum 在单个 switch-case 中获取具有相同参数的多个 case 的关联值
- javascript - eslint vars-on-top 在 const 和 let 声明上给出警告并且不能被禁用
- java - 我怎样才能让我的按钮工作?爪哇