【问题标题】:Substitute all occurrences within a specific context using Python regex使用 Python 正则表达式替换特定上下文中的所有匹配项
【发布时间】: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


【解决方案1】:

一个选项,使用带有回调函数的re.sub

inp = "{foo foo} foo {foofoo} foo foo"
output = re.sub(r'\{(.*?)\}', lambda x: '{' + x.group(1).replace('foo', 'bar') + '}', inp)
print(input)
print(output)

打印出来:

{foo foo} foo {foofoo} foo foo
{bar bar} foo {barbar} foo foo

这里使用的策略是匹配大括号内的所有内容{...}。然后将此内容传递给回调函数,该函数选择性地将foo 替换为bar

【讨论】:

  • 这太好了,我不知道你可以传入一个 lambda 进行正则表达式匹配!
猜你喜欢
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
相关资源
最近更新 更多