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中利用此优势?
答案 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
就是这样:
(?<=\[)
-正向后看,断言文字[
正位于比赛开始之前[^]]*
-任意数量的非]
字符(实际匹配)(?=\]a)
-前瞻性肯定,断言文本]a
直接位于匹配文本之后。