【问题标题】:How to match and replace this pattern in Python RE?如何在 Python RE 中匹配和替换此模式?
【发布时间】:2019-06-24 19:09:47
【问题描述】:
s = "[abc]abx[abc]b" 

s = re.sub("\[([^\]]*)\]a", "ABC", s) 

'ABCbx[abc]b' 

在字符串 s 中,当它被 [] 括起来时,我想匹配 'abc',然后是 'a'。所以在那个字符串中,第一个 [abc] 将被替换,而第二个不会。

我写了上面的模式,它匹配:

match anything starting with a '[', followed by any number of characters which is not ']', then followed by the character 'a'. 

但是,在替换中,我希望字符串如下:

[ABC]abx[abc]b . // NOT ABCbx[abc]b

也就是说,我不希望替换整个匹配的模式,而只替换带有括号 [] 的任何内容。如何实现?

match.group(1) 将返回 [] 中的内容。但是如何在 re.sub 中利用这一点呢?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    为什么不简单地在替换中包含[]

    s = re.sub("\[([^\]]*)\]a", "[ABC]a", s) 
    

    【讨论】:

    • 这行得通,但您需要替换为"[ABC]a",因为a 也是匹配的一部分。
    【解决方案2】:

    存在不止一种方法,其中一种是exploting groups

    import re
    s = "[abc]abx[abc]b"
    out = re.sub('(\[)([^\]]*)(\]a)', r'\1ABC\3', s)
    print(out)
    

    输出:

    [ABC]abx[abc]b
    

    请注意,re.sub 的第一个参数中有 3 个组(括在括号中),然后我指的是第一个和第三个(注意索引从 1 开始)所以它们保持不变,而不是第二组我放 ABC . re.sub 的第二个参数是原始字符串,所以我不需要转义 \

    【讨论】:

      【解决方案3】:

      这个正则表达式对前缀/后缀断言使用lookarounds,因此匹配文本本身只是“abc”:

      (?<=\[)[^]]*(?=\]a)
      

      示例:https://regex101.com/r/NDlhZf/1

      那就是:

      1. (?&lt;=\[) - 积极的后视,断言文字 [ 直接在比赛开始之前
      2. [^]]* - 任意数量的非] 字符(实际匹配)
      3. (?=\]a) - 正向预测,断言文本 ]a 直接跟在匹配文本之后。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-17
        • 2016-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多