如何在Python中替换为正则表达式组

时间:2010-06-17 05:41:26

标签: python regex

>>> s = 'foo: "apples", bar: "oranges"'
>>> pattern = 'foo: "(.*)"'

我希望能够像这样替换成小组:

>>> re.sub(pattern, 'pears', s, group=1)
'foo: "pears", bar: "oranges"'

有一个很好的方法吗?

2 个答案:

答案 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"