python 2.7+中的组引用无效

时间:2012-11-29 23:31:48

标签: python regex django

我正在尝试将我的网页中的所有WikiLink类型的字符串(在django中创建)转换为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)

这将返回以下字符串,替换为字符串的十六进制值。

"this is a string to Test whether<a href='/mywiki/\x01>\x01</a>'will work<a href='/mywiki/\x01>\x01</a>'"

查看python help的re.sub,我尝试将\ 1更改为\ g&lt; 1&gt;但这会导致无效的组引用错误。

请帮助我了解如何使其正常工作

1 个答案:

答案 0 :(得分:18)

这里的问题是您在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'

反向引用\1引用匹配中的组1,它是与第一个带括号的子表达式匹配的部分。同样,\2是第2组,与第二个带括号的子表达式匹配的部分,依此类推。如果在少于1个组时使用\1,则某些正则表达式引擎会给出错误,其他引用将使用文字'\1'字符,ctrl-A; Python执行后者,ctrl-A的规范表示是'\x01',这就是为什么你这样看的原因。

组0是整场比赛。但在这种情况下,这不是你想要的,因为你不希望空格成为替换的一部分。

您需要g语法的唯一原因是简单的反向引用不明确。例如,如果sub为123\1456,则无法判断这是表示123,其次是组1,后跟456还是123按组1456,或......

Further reading on grouping and backreferences.