5

我正在尝试将我的网页(在 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)

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

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

查看 re.sub的python 帮助,我尝试将 \1 更改为 \g<1> 但这会导致无效的组引用错误。

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

4

1 回答 1

21

这里的问题是您在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 组,或者……</p>

进一步阅读分组和反向引用。

于 2012-11-29T23:34:00.387 回答