>>> s = 'foo: "apples", bar: "oranges"'
>>> pattern = 'foo: "(.*)"'
我希望能够像这样替换成小组:
>>> re.sub(pattern, 'pears', s, group=1)
'foo: "pears", bar: "oranges"'
有一个很好的方法吗?
答案 0 :(得分:10)
对我来说,有点像:
rx = re.compile(r'(foo: ")(.*?)(".*)')
s_new = rx.sub(r'\g<1>pears\g<3>', s)
print(s_new)
请注意重新?
,因此它以第一个"
结束,同时注意第1组和第3组中的"
,因为它们必须在输出中。
而不是\g<1>
(或\g<number>
),您可以只使用\1
,但请记住使用“原始”字符串,g<1>
形式是优先的,因为{{1可能含糊不清(在Python doc中查找示例)。
答案 1 :(得分:0)
re.sub(r'(?<=foo: ")[^"]+(?=")', 'pears', s)
正则表达式匹配一系列字符
foo: "
,"
(?<=)
和(?=)
为lookbehind and lookahead
如果foo
的值包含转义的quots,则此正则表达式将失败。使用以下内容来捕捉它们:
re.sub(r'(?<=foo: ")(\\"|[^"])+(?=")', 'pears', s)
示例代码
>>> s = 'foo: "apples \\\"and\\\" more apples", bar: "oranges"'
>>> print s
foo: "apples \"and\" more apples", bar: "oranges"
>>> print re.sub(r'(?<=foo: ")(\\"|[^"])+(?=")', 'pears', s)
foo: "pears", bar: "oranges"