python 2.7+中的组引用无效;
我正在尝试将我的网页(用django创建)中所有WikiLink类型的字符串转换为html链接 我使用下面的表达式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)
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提供的伟大链接。如果他在编辑之前加了一条评论,我会加上一条。