在re.sub中创建一个子组引用(\ g< 1>)可选

时间:2015-06-06 12:24:18

标签: python regex

如何在\g<1>中选择子组引用(re.sub())?例如:

import re

regexp = re.compile(r'^http://(lists\.|www\.)?example\.com/')
regexp.sub(
    r'https://\g<1>example.com/',
    r'http://example.com/helllo-there'
)

我希望\g<1>替换为空,可选子组不匹配(并且不会引发异常)。

我知道我可以使用regexp.match(..).groups()来检查哪些组存在,但这对我来说似乎很多工作(我们需要一堆替换模式,因为一些示例可以达到{{1} })。它也不是很快,因为我们需要\g<6> match

例如在JavaScript中,我可以使用replace,如果它不匹配则会被忽略:

$1

3 个答案:

答案 0 :(得分:3)

另一个选择是提供一个明确的空替代方案:

 regexp = re.compile(r'^http://(lists\.|www\.|)example\.com/')

此外,您只能使用\1代替\g<1>

答案 1 :(得分:2)

如果我理解正确,请执行x(y)?z而不是^('?)[^']*\1,(?:[^']*'[^']*'){2}

答案 2 :(得分:2)

我会喜欢这样的。只需将模式放在非捕获组中,并将其设置为可选。现在在捕获组中包含可选的非捕获组。

>>> re.sub(r'^http://((?:lists\.|www\.)?)example\.com/',r'https://\g<1>example.com/', 'http://example.com/helllo-there')
'https://example.com/helllo-there'