4

文字列内の特定の番号のすべての出現を置き換えようとしています。たとえば、特定の番号の特定のインスタンスを別のインスタンスに置き換えたいとします。

>>> 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'

グループ参照が次の番号と混同されないようにするにはどうすればよいですか?

4

2 に答える 2

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>で定義されているように、nameという名前のグループと一致する部分文字列を使用します。対応するグループ番号を使用します。したがって、はと同等ですが、などの置換ではあいまいではありません。グループ2への参照の後にリテラル文字「0」が続くのではなく、グループ20への参照として解釈されます。後方参照 は、REと一致する部分文字列全体を置き換えます。(?P<name>...)\g<number>\g<2>\2\g<2>0\20\g<0>

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

于 2013-03-01T23:08:48.223 に答える
1

どうやら名前の付いたグループは、以下を使用して参照できます\g<name>

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

re.sub()実際にこれを説明するためのPythonドキュメント。図を見る:http://docs.python.org/2/library/re.html

于 2013-03-01T23:04:09.503 に答える