gpt4 book ai didi

python - 如何将回调传递给 re.sub,但仍插入匹配捕获?

转载 作者:行者123 更新时间:2023-12-03 18:33:59 24 4
gpt4 key购买 nike

考虑:

text = "abcdef"
pattern = "(b|e)cd(b|e)"

repl = [r"\1bla\2", r"\1blabla\2"]
text = re.sub(pattern, lambda m: random.choice(repl), text)

我想用列表中的条目随机替换匹配项 repl .但是当使用 lambda m: random.choice(repl)作为回调,它不会取代 \1 , \2等等,它的捕获不再,返回 "\1bla\2"作为纯文本。

我试着查找 re.py关于他们如何在内部执行此操作,因此我可能能够调用相同的内部函数,但这似乎并不简单。

上面的例子返回 a\1bla\2fa\1blabla\2fabblaefabblablaef在我的情况下是有效的选择。

请注意,我使用的是一个函数,因为在多个匹配项的情况下,例如 text = "abcdef abcdef" ,它应该从 repl 中随机选择一个替换对于每场比赛——而不是对所有比赛使用相同的替换。

最佳答案

如果您传递一个函数,您将失去反向引用的自动转义。你只需要得到匹配对象,就可以完成这项工作。所以你可以:

在正则表达式中选择一个字符串而不是传递一个函数:

text = "abcdef"
pattern = "(b|e)cd(b|e)"

repl = [r"\1bla\2", r"\1blabla\2"]
re.sub(pattern, random.choice(repl), text)
# 'abblaef' or 'abblablaef'

或者编写一个函数来处理匹配对象并允许更复杂的处理。您可以利用 expand使用反向引用:
text = "abcdef abcdef"
pattern = "(b|e)cd(b|e)"

def repl(m):
repl = [r"\1bla\2", r"\1blabla\2"]
return m.expand(random.choice(repl))


re.sub(pattern, repl, text)

# 'abblaef abblablaef' and variations

当然,您可以将该函数放入 lambda 中:
repl = [r"\1bla\2", r"\1blabla\2"]
re.sub(pattern, lambda m: m.expand(random.choice(repl)), text)

关于python - 如何将回调传递给 re.sub,但仍插入匹配捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60700187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com