为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式用 self 替换

正则表达式用 self 替换

郎朗坤 2023-09-12 17:31:57
我正在使用正则表达式来标记消息中的信息。这些消息的结构是我要查找的某些信息是有序的。然而,某些消息的顺序以及我正在查找的特定信息类型可能会根据消息类型而改变。下面是此类消息的一个最小示例message = 'foo 1234567890 bar'假设我知道我的消息包含 3 条我正在寻找的信息:var_a、var_b和var_c。我知道 和var_a是var_c小写字符串,而var_b是数字,它们按var_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]'这包括空格(或原始消息中的任何其他类型的文本)。
查看完整描述

2 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

我会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]


查看完整回答
反对 回复 2023-09-12
?
POPMUISE

TA贡献1765条经验 获得超5个赞

的解决方案re.sub可能更优雅,但您也可以使用 来groupdict获取span各个组的 ,然后替换它们(相反,因为它会改变索引):


m = r.match(message)

msg = list(message)

for k, v in reversed(list(m.groupdict().items())):

    s, e = m.span(k)

    msg[s:e] = list(f"[{k}]{v}[{k}]")


print(''.join(msg))

# '[var_a]foo[var_a] [var_b]1234567890[var_b] [var_c]foo[var_c]'

或者,如果这些组始终仅由空格分隔(并且可以在输出中用单个空格替换更多空格),您也可以简单地显示其中的join项目groupdict(顺序应匹配)。


print(" ".join(f"[{k}]{v}[{k}]" for k, v in m.groupdict().items()))


查看完整回答
反对 回复 2023-09-12
  • 2 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信