Python 如何区分组引用和其后面的数字?
我试图替换字符串中某个特定数字的所有出现。例如,假设我想用另一个数字替换给定数字的特定实例:Python 如何区分组引用和其后面的数字?,python,regex,Python,Regex,我试图替换字符串中某个特定数字的所有出现。例如,假设我想用另一个数字替换给定数字的特定实例: >>> number1 = 33 >>> number2 = 1 >>> re.sub('(foo)%i' % number1, '\\1%i' % number2, 'foo33') Traceback (most recent call last): File "<stdin>", line 1, in ? File "/ho
>>> 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'
编号1=33
>>>数字2=1
>>>re.sub('(foo)%i'%number1',\\1%i'%number2',foo33')
回溯(最近一次呼叫最后一次):
文件“”,第1行,是否在中?
文件“/home/david_clymer/Development/VistaShare/ot_git/lib/python2.4/sre.py”,第142行,子部分
返回编译(模式,0).sub(repl,字符串,计数)
文件“/home/david_clymer/Development/VistaShare/ot_git/lib/python2.4/sre.py”,第260行,在过滤器中
返回sre_parse.expand_模板(模板,匹配)
expand_模板中的文件“/home/david_clymer/Development/VistaShare/ot_git/lib/python2.4/sre_parse.py”,第784行
引发错误,“无效的组引用”
sre_constants.error:无效的组引用
>>>re.sub('(foo)%i'%number1',\\1%i'%number2',foo33')
“富1”
如何防止组引用与以下数字混淆?显然,可以使用
\g
引用已命名的组:
>>re.sub('(?Pfoo)%i'%number1',\\g%i'%number2',foo33')
“foo1”
re.sub()
的python文档实际上解释了这一点。如图所示:重新导入
数字1=33
数字2=1
打印子目录('(foo)%i'%number1',\g%i'%number2',foo33')
re.sub(模式、应答、字符串、计数=0、标志=0)
除了如上所述的字符转义和反向引用之外
上面,\g
将使用名为
名称,由(?P..)
语法定义<代码>\g使用
对应组号<因此,code>\g相当于\2
,但
在替换中没有歧义,例如\g0
<代码>\20将是
解释为提及第20组,而非提及第2组
后跟文字字符“0”。反向参考\g
由RE匹配的整个子字符串中的替换项
这是不久前在这里被问到的。让我发现这个问题……可能想考虑R′g…相反,它是为了逃逸字符串literal@JonClements:我正在这样做…但是括号中的值显然在显示时被屏蔽了。我想Jon说的是使用Python的原始字符串表示法,这样你就不必重复反斜杠:
r'\g'
,而不是'\\g'
。此外,您还可以对编号的组使用命名组语法,如@eyquem所示。
>>> re.sub('(?P<prefix>foo)%i' % number1, '\\g<prefix>%i' % number2, 'foo33')
'foo1'
import re
number1 = 33
number2 = 1
print re.sub('(foo)%i' % number1, '\g<1>%i' % number2, 'foo33')