python - 正则表达式替换为自我
问题描述
我正在使用正则表达式来标记消息中的信息。这些消息的结构是我要查找的某些信息是有序的。然而,某些消息的顺序以及我正在寻找的特定类型的信息可能会根据消息的类型而改变。以下是此类消息的最小示例
message = 'foo 1234567890 bar'
假设我知道我的消息由我正在寻找的 3 条信息组成var_a
,var_b
、 和var_c
。我知道var_a
andvar_c
是小写字符串,var_b
而是一个数字,它们出现在 ordervar_a
中var_b
,然后出现var_c
在我的消息中。我可以使用
r = re.compile('(?P<var_a>[a-z]*)\s+(?P<var_b>[0-9]*)\s+(?P<var_c>[a-z]*)')
d = [m.groupdict() for m in r.finditer(message)][0]
for key, value in d.items():
message = message.replace(value, f'[{key}]{value}[{key}]')
输出
'[var_a]foo[var_a] [var_b]1234567890[var_b] [var_c]bar[var_c]'
但是,当我的消息中有重复的单词时,例如var_a
和var_c
,即
message = 'foo 1234567890 foo'
我得到作为输出
'[var_a][var_c]foo[var_c][var_a] [var_b]1234567890[var_b] [var_a][var_c]foo[var_c][var_a]'
我将如何处理这个问题?我想过在正则表达式匹配期间立即替换短语(使用类似 re.sub 的东西),但我似乎无法弄清楚如何做到这一点,因为我需要能够引用我在我的正则表达式(如 var_a 等)以及分配给这些名称的内容。
我想获得的输出是
'[var_a]foo[var_a] [var_b]1234567890[var_b] [var_c]foo[var_c]'
这包括空格(或原始消息中的任何其他类型的文本)。
解决方案
我会re.sub
在这里用作:
message = 'foo 1234567890 bar'
output = re.sub(r'\b([a-z]+) (\d+) ([a-z]+)\b', '[var_a]\\1[var_a] [var_b]\\2[var_b] [var_c]\\3[var_c]', message)
print(output)
这打印:
[var_a]foo[var_a] [var_b]1234567890[var_b] [var_c]bar[var_c]
推荐阅读
- javascript - 在不影响没有 iframe id 的父页面的情况下刷新 iframe
- java - 对话出现在默认消息应用程序中
- vim - 如何确定 Vim 中的当前窗口是否在新选项卡中打开?
- python - 未找到请求的 URL。pythonanywhere中的404错误
- java - 调用 REST API 的次数
- python - python3 itertools.filterfalse 非常慢。有哪些替代方案?
- python - 将列表拆分为 N 部分以获得元组列表
- c++ - 如何在这里运行while循环?
- python - 在多次碰撞后附加项目
- javascript - 如何在Angular 6中单击按钮时获取ngPrime自动完成文本