python 2.7+中的组引用无效;

python 2.7+中的组引用无效;,python,regex,django,Python,Regex,Django,我正在尝试将我的网页(用django创建)中所有WikiLink类型的字符串转换为html链接 我使用下面的表达式 import re expr = r'\s+[A-Z][a-z]+[A-Z][a-z]+\s' repl=r'<a href="/photos/\1">\1</a>' mystr = 'this is a string to Test whether WikiLink will work ProPerly' parser=re.compile(expr)

我正在尝试将我的网页(用django创建)中所有WikiLink类型的字符串转换为html链接

我使用下面的表达式

import re
expr = r'\s+[A-Z][a-z]+[A-Z][a-z]+\s'
repl=r'<a href="/photos/\1">\1</a>'
mystr = 'this is a string to Test whether WikiLink will work ProPerly'

parser=re.compile(expr)
parser.sub(repl, mystr)
重新导入
expr=r'\s+[A-Z][A-Z]+[A-Z][A-Z]+\s'
repl=r''
mystr='这是一个字符串,用于测试WikiLink是否能正常工作'
parser=re.compile(expr)
sub(repl,mystr)
这将返回以下字符串,并替换该字符串的十六进制值

"this is a string to Test whether<a href='/mywiki/\x01>\x01</a>'will work<a href='/mywiki/\x01>\x01</a>'"
“这是一个字符串,用于测试‘是否有效’”
查看for re.sub,我尝试将\1更改为\g,但这会导致无效的组引用错误


请帮助我了解如何使此工作

这里的问题是,
expr
中没有任何捕获的组

无论匹配的哪个部分要显示为
\1
,都需要在括号中加上。例如:

>>> expr = r'\s+([A-Z][a-z]+[A-Z][a-z]+)\s'
>>> parser=re.compile(expr)
>>> parser.sub(repl, mystr)
'this is a string to Test whether<a href="/photos/WikiLink">WikiLink</a>will work ProPerly'
expr=r'\s+([A-Z][A-Z]+[A-Z][A-Z]+)\s' >>>parser=re.compile(expr) >>>sub(repl,mystr) '这是一个字符串,用于测试是否可以正常工作' backreference
\1
引用匹配中的组1,它是匹配第一个括号中的子表达式的部分。类似地,
\2
是组2,与第二个括号中的子表达式匹配的部分,依此类推。如果在少于1个组时使用
\1
,某些regexp引擎将给您一个错误,其他引擎将使用文本
'\1'
字符,即ctrl-a;Python实现了后者,而ctrl-A的规范表示形式是
'\x01'
,因此您可以这样看待它

第0组是全部匹配项。但在这种情况下,这不是您想要的,因为您不希望空间成为替换的一部分

需要
g
语法的唯一原因是当简单的反向引用不明确时。例如,如果sub是
123\1456
,则无法判断这是否意味着
123
,后面是组1,后面是
456
,或者
123
后面是组1456,或者


谢谢你的解释。添加妄想症()解决了我的问题。感谢@m.buettner提供的伟大链接。如果他在编辑之前加了一条评论,我会加上一条。