【发布时间】:2021-03-29 05:53:13
【问题描述】:
使用 Python 3.7,如何替换字符串中所有出现的正则表达式,但前提是出现在特定上下文中?
例如,如何将foo 的所有实例替换为bar,但前提是foo 在花括号内?
输入:
{foo foo} foo {foofoo} foo foo
输出:
{bar bar} foo {barbar} foo foo
我已经尝试了很多使用 re.sub() 的方法,包括使用环视,但无法找到完美的方法。
例如,我尝试使用捕获的组来解构和重建正则表达式:
re.sub(
r"(?P<delimiter>{)(?P<before_foo>.*)(?P<foo>foo)(?P<after_foo>.*)(?P<end_delimiter>})",
r"\g<delimiter>\g<before_foo>bar\g<after_foo>\g<end_delimiter>",
input
)
这只会在花括号内进行替换,但如果字符串中有多个foo,则会失败。
我也尝试过使用环视:
re.sub(r"foo(?!.*{)(?=.*})", bar, input)
只要字符串中只有一对花括号就可以很好地工作,因此对于输入{foo foo} foo,它会正确输出{bar bar} foo,但对于输入{foo foo} foo {foofoo} foo foo,它会错误输出{foo foo} foo {barbar} foo foo .
【问题讨论】:
-
{food}的预期输出是什么?{bard}或{food}? -
甚至
{foobar} -
@anubhava,我尝试了很多东西,但没有一个好到可以分享。我不想让未来的读者与错误方向的想法混淆。关于
{food}- 我期待{bard}。对于{foobar},我期待{barbar}。
标签: python python-3.x regex