作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑:
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"
作为纯文本。
a\1bla\2f
或
a\1blabla\2f
而
abblaef
或
abblablaef
在我的情况下是有效的选择。
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
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/
我是一名优秀的程序员,十分优秀!