【问题标题】:Replacing only a specific group within a matched expression仅替换匹配表达式中的特定组
【发布时间】:2012-03-10 17:49:35
【问题描述】:

我正在解析我想要更改的文本,但仅限于特定行。

我有一个正则表达式模式,如果它是一条感兴趣的行,它会捕获整行,并且在表达式中我有一个记住的一组我真正想要更改的东西。

我希望能够仅更改匹配表达式中的特定组,而不是替换整个表达式(这将替换整行)。

例如:

我有一个文本文件:

This is a completely silly example.
something something "this should be replaced" bla.
more uninteresting stuff

我有正则表达式: pattern = '.*("[^"]*").*'

然后我抓住第二行,但我只想替换行内的 "this should be replaced" 匹配组,而不是整行。 (所以使用re.sub(pattern, replacement, string) 不会完成这项工作。

提前致谢!

【问题讨论】:

    标签: python regex


    【解决方案1】:

    怎么了

    r'"[^"]+"'
    

    你在匹配表达式前后的.*也匹配零长度字符串,所以你根本不需要它。

    re.sub(r'"[^"]+"', 'DEF', 'abc"def"ghi')
    # returns 'abcDEFghi'
    

    您的示例文本将变成:

    'This is a completely silly example.\nsomething something DEF bla.\nmore uninteresting stuff
    

    【讨论】:

      【解决方案2】:

      eumiro 答案在这种情况下是最好的,但为了完整起见,如果您确实需要对 pre、inside 和 post 文本执行一些更复杂的处理,您可以简单地使用多个组,例如:

      '(.*)("[^"]*")(.*)'
      

      (第一组提供前面的文字,第三组提供后面的文字,随心所欲)

      另外,你可能更喜欢在前半部分禁止 ":

      '([^"]*)("[^"]*")(.*)'
      

      【讨论】:

      • 您不能在选择时使用替换。
      【解决方案3】:

      re.matchre.search 返回一个“匹配对象”。 (请参阅 python 文档)。假设您要替换 RE 中的第 3 组,请取出其开始/结束索引并直接替换子字符串:

      mobj = re.match(pattern, line)
      start = mobj.start(3)
      end = mobj.end(3)
      line = line[:start] + replacement + line[end:]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-11
        • 2023-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多