re.sub('a(b)','d','abc')
产量 dc
,而不是 adc
。
为什么 re.sub
替换了整个捕获组,而不只是捕获组’(b)‘?
原文由 Nick 发布,翻译遵循 CC BY-SA 4.0 许可协议
re.sub('a(b)','d','abc')
产量 dc
,而不是 adc
。
为什么 re.sub
替换了整个捕获组,而不只是捕获组’(b)‘?
原文由 Nick 发布,翻译遵循 CC BY-SA 4.0 许可协议
我知道这不是严格回答 OP 问题,但这个问题很难用谷歌搜索(被 \1 解释淹没……)
对于那些像我一样来到这里的人,因为他们想实际用字符串替换不是第一个的捕获组,而不需要对字符串或正则表达式有特殊了解:
#find offset [start, end] of a captured group within string
r = regex.search(oldText).span(groupNb)
#slice the old string and insert replacementText in the middle
newText = oldText[:r[0]] + replacementText + oldText[r[1]:]
我知道这是想要的行为,但我仍然不明白为什么 re.sub 不能指定它应该替换的实际捕获组……
原文由 Mr Buisson 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
因为它应该替换整个出现的模式:
如果它只替换一些子组,那么具有多个组的复杂正则表达式将无法工作。有几种可能的解决方案:
re.sub('ab', 'ad', 'abc')
我最喜欢的,因为它非常易读和明确。re.sub('(a)b', r'\1d', 'abc')
repl
参数并使其处理Match
对象并返回所需的结果。re.sub('(?<=a)b', r'd', 'abxb')
yieldsadxb
。该组开头的?<=
说“这是一个前瞻”。