使用re.sub()时无效的组引用

时间:2018-02-09 10:39:15

标签: python regex replace

我在使用re.sub。时遇到了麻烦。我从其他答案中了解到,这是因为我引用了一个我没有的捕获组。

我的问题是:如何调整代码以拥有有效的群组?

s = "hello a world today b is sunny c day"
markers = "a b c".split()
pattern = r'\b' + ' (?:\w+ )?(?:\w+ )?'.join(markers) + r'\b'
text = re.sub(pattern, r'<b>\1</b>', s)   # this gives error

我希望这样:"hello <b>a world today b is sunny c</b> day"

3 个答案:

答案 0 :(得分:1)

如果模式中没有捕获组,则无法使用\1替换反向引用。将捕获组添加到模式:

pattern = r'\b(' + ' (?:\w+ )?(?:\w+ )?'.join(markers) + r')\b' # or
              ^                                            ^
pattern = r'\b({})\b'.format(r' (?:\w+ )?(?:\w+ )?'.join(markers))

或者,只需使用\g<0>插入整个匹配而不是捕获组值(然后,不需要修改正则表达式):

text = re.sub(pattern, r'<b>\g<0></b>', s) 

请参阅Python demo

答案 1 :(得分:0)

你的正则表达中没有任何组。

(?:...)是一个非捕获组,我想你想要

pattern = r'\b(' + ' (?:\w+ )?(?:\w+ )?'.join(markers) + r')\b'

答案 2 :(得分:0)

这段代码可以得到你想要的结果。我已经测试了。

import re
s = "hello a world today b is sunny c day"
pat = r'(a.*c)'
result = re.sub(pat,r'<b>\1</b>',s)