正则表达式组引用错误

4
p = r'([\,|\.]\d{1}$)'
re.sub(p, r"\1", v)

代码可以运行,但我想在捕获组中添加一个零,而不是替换为捕获组'10',我该怎么做?

re.sub(p, r"\10", v)

失败:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 151, in sub
    return _compile(pattern, flags).sub(repl, string, count)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 275, in filter
    return sre_parse.expand_template(template, match)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sre_parse.py", line 802, in expand_template
    raise error, "invalid group reference"
sre_constants.error: invalid group reference

正如我在答案中所说:re.sub(p, r"\g<1>0", v) - qstebom
[\,|\.] 看起来不对。你是不是想说 [.,] - georg
3个回答

6
只需将组引用用'\g<#>'括起来即可:
import re
pattern = r'([\,|\.]\d{1}$)'
string = 'Some string .1\n'
rep = r'\g<1>0'
re.sub(pattern, rep, string)
> 'Some string .10\n'

来源: http://docs.python.org/2/library/re.html#re.sub

re.sub() 方法用于在字符串中替换匹配的子串,可以使用正则表达式模式或函数进行替换。此方法返回修改后的字符串。


1
使用一个命名捕获组:
p = r'(?P<var>[\,|\.]\d{1})$'
re.sub(p, r"\g<var>0", v)

e.g.

>>> p = r'(?P<var>[\,|\.]\d{1})$'
>>> v = '235,5'
>>> re.sub(p, r"\g<var>0", v)
'235,50'

0

最简单的方法(也可能是唯一的方法,我并不确定)是给捕获组命名,然后通过名称引用它:

>>> re.sub(p, r'\10', '1.2')
Traceback (most recent call last):
   ...
sre_constants.error: invalid group reference
>>> p = r'(?P<frac>[\,|\.]\d{1}$)'
>>> re.sub(p, r'\g<frac>0', '1.2')
'1.20'

选择一个比“frac”更好的名称(我从我的...嗯,耳朵中拔出来的,是的,让我们用“耳朵”吧 :-) )。

克里斯


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接