如何在Python RE中匹配并替换此模式?

时间:2019-06-24 19:09:47

标签: python regex

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中利用此优势?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

存在不止一种方法,其中一种是展开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组(括在方括号中),然后我引用1st和3rd(注意索引从1开始),因此它们保持不变,而不是我将{ {1}}。 ABC的第二个参数是原始字符串,因此不需要转义re.sub

答案 2 :(得分:0)

此正则表达式对前缀/后缀断言使用环视,因此匹配文本本身仅为“ abc”:

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

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

就是这样:

  1. (?<=\[)-正向后看,断言文字[正位于比赛开始之前
  2. [^]]*-任意数量的非]字符(实际匹配)
  3. (?=\]a)-前瞻性肯定,断言文本]a直接位于匹配文本之后。