如何区分组引用与紧随其后的数字?

4 投票
2 回答
768 浏览
提问于 2025-04-17 17:38

我想在一个字符串中替换掉所有出现的特定数字。比如说,我想把某个数字的特定位置替换成另一个数字:

>>> number1 = 33
>>> number2 = 1
>>> re.sub('(foo)%i' % number1, '\\1%i' % number2, 'foo33')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/home/david_clymer/Development/VistaShare/ot_git/lib/python2.4/sre.py", line 142, in sub
    return _compile(pattern, 0).sub(repl, string, count)
  File "/home/david_clymer/Development/VistaShare/ot_git/lib/python2.4/sre.py", line 260, in filter
    return sre_parse.expand_template(template, match)
  File "/home/david_clymer/Development/VistaShare/ot_git/lib/python2.4/sre_parse.py", line 784, in expand_template
    raise error, "invalid group reference"
sre_constants.error: invalid group reference
>>> re.sub('(foo)%i' % number1, '\\1 %i' % number2, 'foo33')
'foo 1'

我该怎么做才能让这个替换的数字和后面的数字不混淆呢?

2 个回答

1

显然,命名组可以用 \g<name> 来引用:

>>> re.sub('(?P<prefix>foo)%i' % number1, '\\g<prefix>%i' % number2, 'foo33')
'foo1'

Python 的文档中对 re.sub() 其实有详细解释。你可以去看看: http://docs.python.org/2/library/re.html

4
import re

number1 = 33
number2 = 1
print re.sub('(foo)%i' % number1, '\g<1>%i' % number2, 'foo33')

re.sub(pattern, repl, string, count=0, flags=0)

除了上面提到的字符转义和反向引用,\g<name> 可以用来引用一个命名的组匹配到的子字符串,这个组是通过 (?P<name>...) 这种语法定义的。\g<number> 则是用对应的组编号;比如 \g<2> 就等同于 \2,但在替换时不会产生歧义,比如 \g<2>0。这里 \20 会被理解为引用第20组,而不是第2组后面跟着字符 '0'。反向引用 \g<0> 则会替换为正则表达式匹配到的整个子字符串。

http://docs.python.org/2/library/re.html#module-re

撰写回答